在SQL Server中使用GUID键删除行

时间:2017-04-25 19:14:41

标签: sql sql-server azure-sql-database

使用此查询从表中删除约1,000,000行时出现性能问题:

DELETE cr from CrawlRow cr
INNER JOIN Crawl c ON cr.Crawl_Id = c.Id
WHERE c.CrawlRound_Id = 'BE821DFF-3F2F-4850-80A8-10D4EF0275F5'

Crawl.CrawlRound_Id的类型为uniqueidentifier,我在其上定义了索引。

问题1:'BE821DFF-3F2F-4850-80A8-10D4EF0275F5'转换为Guid是问题的根源吗?

问题2:如何设置Guid字面值而不是字符串文字以避免此转换开销?

问题3:如果Guid不是问题,我该如何克服此性能问题?

1 个答案:

答案 0 :(得分:0)

在尝试删除复杂的查询时,我经常遇到类似的问题...就好像在幕后创建了一个游标,并且它希望在每次删除后重新选择数据集,因为正在修改一行。

尝试删除如下所示的内容,在此处将删除工作包装在一个非常基本的select语句中。我冒昧地使用'rowIndex'来识别种子。

DELETE FROM CrawlRow WHERE rowIndex IN (
  SELECT rowIndex from CrawlRow cr
  INNER JOIN Crawl c ON cr.Crawl_Id = c.Id
  WHERE c.CrawlRound_Id = 'BE821DFF-3F2F-4850-80A8-10D4EF0275F5'
)

这仍然是一项重大任务,删除了一百万个任何东西......所以不要期望太多的性能提升。