3

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

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

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

4

2 回答 2

6

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

在 SQL Server 中,您可以joinexcept. 所以,你可以得到你想要的查询:

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)

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

于 2013-04-18T13:49:39.527 回答
1

您的第一个查询很慢,因为您在 where 子句中连接字段,这本质上是一个函数。在 where 子句中运行函数时,几乎都会发生这种情况。这是一个更简单的例子。这会很快。

where myDateTimeField >= @DateValue
and myDateTimeField < dateadd(day, 1, @DateValue)

这在逻辑上是相同的,但会很慢

where cast(myDateTimeField as date) = @DateValue
于 2013-04-18T13:49:30.800 回答