2010-07-15 94 views
0

我在类似主题上看到的大多数问题都与如何加速插入表格有关。加速SQL Server 2005上的删除?

我想知道如何加快删除速度?

我不能截断,也没有删除表,我必须做类似

DELETE FROM table WHERE id IN (SELECT id FROM other_table) 

回答

0

不“表”的东西对“ID”列的索引?
如果不是,SQL Server可能会执行表扫描以查找要删除的记录。你可以通过在“id”列上创建一个索引来加速它。

与“other_table”相同 - 如果该表上的选择也具有WHERE子句,请检查在那里使用的列是否已建立索引。

1

对于您的情况没有特别的帮助,因为这取决于您的情况。

一般规则(如适用):

  1. 有table.id
  2. 一个非聚集索引,但删除所有其他键/ indexies从未或很少使用
  3. 删除所有其他按键/ indexies之前删除操作并在之后重建它们
  4. 避免针对table.id的custered索引
  5. 使用索引加快“SELECT id FROM other_table”(假定此子选择具有任何种类的where子句i n真实世界)
0

以较小的批次删除,如同时记录1000条记录。实际的删除操作会花费更长的时间(确保具有所需的索引),但在长时间运行的删除正在运行时,用户不会被锁定在表外。

1

一些一般的想法要遵循。

  • 确保您没有从具有聚簇索引的列中删除。
  • 确保该行中的其他列具有键或索引。
  • 确保您没有在选定部分中选择大量记录。

除此之外,它只是一个主观的猜测,是什么导致你的减速。最好的办法是尝试一下,看看有什么可以帮助,什么让它变得更慢,了解如何在调用删除时找到行中的项目,并查看哪些内容最长。

1
  • 批它
  • 使用EXISTS
  • 确保您有ID正确的索引两个表中

例子:

SELECT 'Starting' 
WHILE ROWCOUNT <> 0 
    DELETE TOP (1000000) T 
    FROM table T 
    WHERE EXISTS (
     SELECT * from otherTable OT WHERE T.id = OT.id 
    ) 

一些灵感或者:Bulk DELETE on SQL Server 20087 billion row delete