在两个select语句上使用UNION或UNION ALL会使它们变得非常慢

时间:2011-03-22 21:22:26

标签: tsql sql-server-2008 union

我有两个查询,我们称之为查询A和查询B.

对于我正在测试的场景,这两个查询都在一秒钟内运行,而查询A返回1个结果,而查询B返回0个结果。

如果我联合(或联合所有)这两个查询,则返回(预期)1结果需要一分多钟。

两个查询都从同一个表中选择相同的列。我可以通过拥有一个高度条件的where子句来重写整个没有联合的东西,但我试图摆脱这样做。

有什么想法吗?我不确定我可以通过共享获得多少确切的查询和架构,但我很乐意尽我所能。

如果对任何人的回复都重要,那么这是在MSSQL 2008上。

3 个答案:

答案 0 :(得分:1)

我会尝试查看Management Studio中针对各个查询的执行计划,然后将其与包含UNION的查询的执行计划进行比较。

如果执行时间差异很大,我会想象UNION'd查询的执行计划有问题。识别不同的东西将有助于指出您(也许我们)正确的方向来解决潜在的问题。

答案 1 :(得分:1)

优化器可以将UNION中非常相似且在同一表中的单独子句合并为一个查询。您可以通过查询计划中缺少UNION运算符来查看此信息。我之前见过类似的东西但很少见

您可以做的是第一次查询SELECT.. INTO #temp...,第二次查询INSERT #temp...

现在,我在哪里读到这个......

答案 2 :(得分:0)

他们都在做桌面扫描吗?听起来它可能超出了缓存容量而你正在缓存到磁盘。

即使它们来自同一个表,记录也可能会独立锁定。