gpt4 book ai didi

SQL 除了性能

转载 作者:行者123 更新时间:2023-12-05 00:50:20 25 4
gpt4 key购买 nike

我正在尝试使用类似于以下查询的查询来查找两个表之间的差异(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')

field1 是 char(5),field2 是 char(1)

这个查询基本上永远不会终止。

当我使用 SET SHOWPLAN_ALL ON 分析这个查询时,我可以看到树中有一个非常高的嵌套循环。当我将上述查询更改为

select * from dev.dbo.table1 
except
select * from test.dbo.table2

查询运行很快,执行计划中没有嵌套循环。

有人可以帮忙解释一下吗?我不明白为什么会有很大的不同。

最佳答案

我的最佳猜测是优化器在估计两个表的基数(大小)方面做得很差。因为它低估了大小,所以生成的查询计划很差。

在 SQL Server 中,您可以在 except 上使用 join 提示。所以,你可以得到你想要的查询:

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)

这消除了嵌套循环连接的选项,选择了更有利的方法。

关于SQL 除了性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16084350/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com