2

在 SQL Server 2008 中,我有几百万行需要删除的数据。它们分散在几张桌子上。删除最多需要 20 秒,我认为这很慢!要删除的数据由一timestamp列标识。以下是我迄今为止为优化所做的工作:

  • 使用隔离级别read uncommitted。我不关心交易。如果我们失败了,用户将再次发出删除操作。并确保新数据没有timestamp我们正在删除的内容。
  • 在父表之前删除叶表。
  • timestamp列是 PK 聚集索引的一部分,实际上它是 PK/索引的第一个位置。
  • 每个表都使用一个循环清空,该循环删除前 200000 个条目,以减少事务日志开销。
  • 服务器上的 I/O 和 CPU 均未达到最大值

我忽略了什么?

我也怀疑将时间戳列移动到 PK 中的第一个位置的效果。这样做之后,我必须重新组织表还是 SQL Server 足够聪明,可以自己完成。我对聚集索引的理解是,由于它定义了行的物理布局,因此强制重新组织数据。但是我们没有收到客户抱怨更改聚集索引操作需要很长时间才能执行的投诉。

4

1 回答 1

0

请确保您要从中删除数据的表具有明确指出的“主键”。

错误的:create table myTable (ID int)

真的: create table myTable (ID int PRIMARY KEY)

除此之外,请尝试添加“选项(重新编译)”,这将有助于提高性能:

DELETE FROM myTable 
WHERE timestamp in (select timestamp from other_table)
OPTION (RECOMPILE)
于 2018-02-12T22:07:10.487 回答