Nob*_*ore 3 sql sql-server-2005 except
我正在尝试使用类似于以下查询的查询来查找两个表之间的差异(DEV 数据库与 TEST 数据库中的同一个表)。每个表有约 30K 行和约 5 列。
select field1,field2,field3,field4,field5 from dev.dbo.table1
where field1+field2 in ('string1','string2','string3',...,'string50')
except
select field1,field2,field3,field4,field5 from test.dbo.table1
where field1+field2 in ('string1','string2','string3',...,'string50')
Run Code Online (Sandbox Code Playgroud)
字段 1 是char(5),字段 2 是char(1)
这个查询基本上永远不会终止。
当我使用 分析此查询时SET SHOWPLAN_ALL ON,我可以看到树中有一个相当高的嵌套循环。当我将上面的查询更改为
select * from dev.dbo.table1
except
select * from test.dbo.table2
Run Code Online (Sandbox Code Playgroud)
查询运行速度很快,并且执行计划中没有嵌套循环。
有人可以帮忙解释一下吗?我不明白为什么会有如此巨大的差异。
我最好的猜测是优化器在估计两个表的基数(大小)方面做得很差。因为它低估了大小,所以它生成的查询计划很差。
在 SQL Server 中,您可以使用join提示except。因此,您可以通过以下方式获得您想要的查询:
select field1,field2,field3,field4,field5 from dev.dbo.table1
where field1+field2 in ('string1','string2','string3',...,'string50')
except
select field1,field2,field3,field4,field5 from test.dbo.table1
where field1+field2 in ('string1','string2','string3',...,'string50')
option (hash join, merge join)
Run Code Online (Sandbox Code Playgroud)
这消除了嵌套循环连接的选项,选择了更有利的方法。