加入收藏 | 设为首页 | 会员中心 | 我要投稿 晋中站长网 (https://www.0354zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

sql-server-2008-r2 – 使用WHERE IN在删除操作期间发生意外扫描

发布时间:2020-12-24 12:51:09 所属栏目:MsSql教程 来源:网络整理
导读:我有一个如下查询: DELETE FROM tblFEStatsBrowsers WHERE BrowserID NOT IN ( SELECT DISTINCT BrowserID FROM tblFEStatsPaperHits WITH (NOLOCK) WHERE BrowserID IS NOT NULL) tblFEStatsBrowsers有553行. tblFEStatsPaperHits有47.974.301行. tblFEStat

如果没有从Group By到Top的转换,优化器“自然地”在反半连接之前选择具有BrowserID聚合的散列连接计划:

DBCC RULEOFF ('GbAggToConstScanOrTop');
GO
DELETE FROM tblFEStatsBrowsers 
WHERE BrowserID NOT IN 
(
    SELECT DISTINCT BrowserID 
    FROM tblFEStatsPaperHits WITH (NOLOCK) 
    WHERE BrowserID IS NOT NULL
) OPTION (MAXDOP 1,RECOMPILE);
GO
DBCC RULEON ('GbAggToConstScanOrTop');

没有MAXDOP 1限制,并行计划:

另一种“修复”原始查询的方法是在执行计划报告的BrowserID上创建缺失索引.当内侧被索引时,嵌套循环最有效.估计半连接的基数在最好的时候是具有挑战性的.没有正确的索引(大表甚至没有唯一的密钥!)根本没有帮助.

保罗

(编辑:晋中站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读