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上创建缺失索引.当内侧被索引时,嵌套循环最有效.估计半连接的基数在最好的时候是具有挑战性的.没有正确的索引(大表甚至没有唯一的密钥!)根本没有帮助. 保罗 (编辑:晋中站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |