【发布时间】:2012-07-18 17:06:18
【问题描述】:
我们有 2 个大约有 40M 行的表。数据库大小约为 20GB,大部分用于这 2 个表。每天,我们需要删除一些数据,即大约 10M 行。因此,我们使用批量删除来将日志文件保持在一定大小。
最初,表没有主键。但是每个表都有唯一的聚集索引。删除需要永远。即删除虚拟机上的 500K 行大约需要 2-3 小时。 * 删除前,索引已重建。
现在,我们将唯一的聚集索引转换为主键。删除 2M 行大约需要 20-30 分钟。
我知道主键和唯一聚集索引之间存在差异,但为什么性能差异如此之大?
有人有见解吗?
谢谢
【问题讨论】:
-
从技术上讲,如果两者都被声明为聚集索引并且在相同的列上,则不应该有任何差异。您是否看到这两种不同方法产生的计划有任何差异?一个明显的问题,但仍然在问,PK 是否与唯一聚集索引在同一列上?另外,为什么要在删除唯一聚集索引之前创建索引?如果数据删除中存在某种模式,请尝试使用分区表..
-
我很好奇将要保留的集合插入到新表中是否有益,然后将
TRUNCATE您的父表插入以节省日志记录。 -
查询计划有什么不同?另外,主索引是否也是集群的(默认情况下是集群的,除非您指定 NONCLUSTERED)?
-
你试过非
Clustered Index吗?原因是 -non clustered index保留Row locator id信息和Clustered index keeps complete row info. second point is did you check it directly at the machine instead of theVirtual machine, because it depends how muchRAM` 被分配给Virtual machine和access time取决于RAM。 -
delete 语句使用哪种 where 子句?还是根本没有 where 子句?
标签: sql sql-server sql-server-2008