在 SQL Server 2008 中,我有几百万行需要删除的数据。它们分散在几张桌子上。删除最多需要 20 秒,我认为这很慢!要删除的数据由一timestamp
列标识。以下是我迄今为止为优化所做的工作:
- 使用隔离级别
read uncommitted
。我不关心交易。如果我们失败了,用户将再次发出删除操作。并确保新数据没有timestamp
我们正在删除的内容。 - 在父表之前删除叶表。
- 该
timestamp
列是 PK 聚集索引的一部分,实际上它是 PK/索引的第一个位置。 - 每个表都使用一个循环清空,该循环删除前 200000 个条目,以减少事务日志开销。
- 服务器上的 I/O 和 CPU 均未达到最大值
我忽略了什么?
我也怀疑将时间戳列移动到 PK 中的第一个位置的效果。这样做之后,我必须重新组织表还是 SQL Server 足够聪明,可以自己完成。我对聚集索引的理解是,由于它定义了行的物理布局,因此强制重新组织数据。但是我们没有收到客户抱怨更改聚集索引操作需要很长时间才能执行的投诉。