![]() |
1
4
好消息是:如果DELETE语句总是删除大约3000行,则情况可能不会随着表的增大而变得更糟。 表的结构可能会对删除操作所用的时间以及由于锁而直接影响用户的程度产生很大影响。 索引“有助于”识别约3000行的行定位器。但是,这些行必须位于“整个”表中(以及表中的每个索引中),然后删除。这个速度慢的一个可能原因是这3000行分布在表(和索引)的不同数据页上。 没有一个适合所有人的答案,但是您应该仔细查看表的组织和索引。可能有一种方法可以改变组织和索引,使注定要删除的行在更少的数据页上,并且删除的查询计划不会执行3000个单独的查找来访问它们。 如果您发布create table并为[cache]创建index语句,我可能会有特定的建议,而不是泛化。 附加说明: 这里还有一些想法。 您有主键约束吗? 如果没有,则没有聚集索引,这意味着表存储为堆。这不太好,尤其是对于一个有很多活动的桌子来说。虽然我没有所有的细节,但我也同意下面的DEM。它应该有助于将主键(应该是集群的)打开(cache_event_id,cache_id)。 另一个瓶颈可能是缓存数据本身。您已经将它包含在三个索引中,所以您将它存储在四个位置!我只是在猜测,但似乎您不太可能有同时从多行返回cache_数据列的查询。因此,您可以只在聚集索引中存储缓存数据(默认情况下,聚集索引包括所有列)。数据库调优顾问很好地为您提供了一些想法,但它并不总是一个好主意去做它所说的。 典型的缓存数据列有多大? 如果它几乎总是大的(超过8K的大小),那么它将导致大量带有LOB溢出页的活动。当有很多LOB活动时,我不是工作负载调优专家,但可能有一些很好的建议资源。要考虑的一件事是(在尝试改进索引并实际查看内存使用情况、缓存命中率等之前)考虑允许更多表行适合页面的更改:
|
![]() |
2
2
如果有大量的删除,可能会向日志文件写入大量内容。如果涉及到任何关系,可能要花很长时间来确定是否允许删除记录。 我也有类似的问题,(但在我的案例中,我需要确保旧记录不可见) 最后添加了一个名为hidden的位字段。因此,“删除”例程实际上只是一个将hidden设置为true的更新语句,并且对查找进行了修改以忽略隐藏的记录。 然后我可以在不影响用户的情况下删除后台隐藏的记录。 |
![]() |
4
1
清理这些数据绝对应该异步进行(通过一个预定的SQL作业、一个服务、填充数据的作业等)。如果您担心查询中的旧项在有机会删除它们之前会返回,那么您可以实现某种类型的版本控制方案,该方案只返回最新的项。 |
![]() |
5
0
我认为问题的一部分是设计,但假设我们只想加快删除速度而不更改其他内容? 只有“cache_event_id”的索引确实用于删除,但不是您可以预期的方式。使用执行计划运行删除,使用索引后,您将看到它还使用主键(假设是集群的)。索引基本上只是作为快捷键来查找需要删除的主键。主键(或任何聚集索引)允许RDBMS物理上知道记录在哪里,因此可以删除它们。 此外,删除记录时,所有索引都需要更新。根据您有多少个索引,以及它们的设置方式,这可以是labourios。
所以我的两个建议是:
|
|
Johnny T · 基于当前值的SQL合并表[重复] 6 月前 |
![]() |
John D · 需要为NULL或NOT NULL的WHERE子句 6 月前 |
![]() |
ojek · 如何对SQL结果进行分组和编号? 6 月前 |
![]() |
senek · 如何在PL/SQL中将选择结果(列)放入数组中 6 月前 |
![]() |
Sax · 规范化Google表格(第一步) 6 月前 |
![]() |
Jatin · 检索卷计数的动态sql抛出错误语法错误[关闭] 6 月前 |
![]() |
Andrus · 如何在sql中查找第二个匹配项 6 月前 |