在SQL Server 2008中,我需要删除数百万行数据。它们分散在几张桌子上。删除需要20秒,我认为这是缓慢的!要删除的数据由timestamp
列标识。以下是我迄今为止为优化所做的工作:
read uncommitted
。我不关心交易。如果我们失败,用户将再次发出删除操作。并且确保新数据不具有我们正在删除的timestamp
。timestamp
列是PK聚集索引的一部分,实际上它是PK /索引的第一个位置。我忽略了什么?
另外,我怀疑将时间戳列移动到PK中的第一个位置的效果。在这样做之后,我必须重新组织表格,或者SQL Server是否足够聪明以便自己完成此操作。我对聚簇索引的理解是,由于它定义了行的物理布局,因此强制重组数据。但我们没有客户抱怨更改的聚簇索引操作需要很长时间才能完成。
答案 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)