使用此查询从表中删除约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
不是问题,我该如何克服此性能问题?
答案 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'
)
这仍然是一项重大任务,删除了一百万个任何东西......所以不要期望太多的性能提升。