0

我在类似主题上看到的大多数问题都与如何加快插入表格的速度有关。

我想知道我可以做些什么来加快删除速度?

我不能截断或删除表,我必须做类似的事情

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

5 回答 5

1

一些一般的想法要遵循。

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

除此之外,这只是对导致您减速的原因的主观猜测。最好的办法是尝试一下,看看什么有帮助,什么使它变慢,了解在调用删除时如何找到行中的项目,并查看那里花费的时间最长。

于 2010-07-19T01:30:18.893 回答
1

您的情况没有具体的帮助,因为这取决于。

一般规则(如适用):

  1. 有 table.id 的非聚集索引
  2. 但删除所有其他从未或很少使用的键/索引
  3. 在删除操作之前删除所有其他键/索引并在之后重建它们
  4. 避免 table.id 的托管索引
  5. 通过使用索引加速“SELECT id FROM other_table”(假设此子选择在现实世界中具有任何类型的 where 子句)
于 2010-07-15T07:03:54.300 回答
1
  • 批量处理
  • 使用存在
  • 确保在两个表中都有正确的 id 索引

例子:

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

一些灵感也许是:SQL Server 2008 上的 Bulk DELETE 和70 亿行删除

于 2010-07-31T05:27:17.620 回答
0

“表”在“id”列上有索引吗?
如果没有,SQL Server 可能会进行表扫描以查找要删除的记录。您可以通过在“id”列上创建索引来加快速度。

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

于 2010-07-15T06:58:53.843 回答
0

分批删除,例如一次删除 1000 条记录。实际的删除需要更长的时间(确保有所需的索引),但在长时间运行的删除运行时,用户不会被锁定在表之外。

于 2010-07-19T00:51:25.170 回答