快速删除数据仓库数据中的许多行

时间:2012-10-28 12:26:52

标签: sql sql-server sql-server-2008 delete-row

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

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

我忽略了什么?

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

1 个答案:

答案 0 :(得分: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)