UNION / UNION ALL慢或不工作

时间:2014-09-04 15:58:30

标签: sql sql-server union union-all

我有两张表格,其中包含客户调查回复数据。我一直在单独运行查询,在不到一秒的时间内返回结果,但如果我将它们联合起来,它似乎永远都会运行。 5分钟以后没有返回任何结果并且没有抛出错误,它仍然显然“正在运行”但我无法弄清楚它实际上要做的事情可能会如此复杂。

从本质上讲,我的查询分别是:

SELECT
oldsurveys.column1 as [something1],
oldsurveys.column2 as [something2],
oldsurveys.column3 as [something3],
'staticvalue1' as [something4],
oldsurveys.column5 as [something5]
FROM
database1.dbo.table1 oldsurveys
WHERE
oldsurveys.column1 = 'something'
AND oldsurveys.column2 >= '2014-01-01 00:00:00'
ORDER BY [something2], [something1]

SELECT
newsurveys.column1 as [something1],
newsurveys.column2 as [something2],
newsurveys.column3 as [something3],
newsurveys.column4 as [something4],
'staticvalue2' as [something5]
FROM
database2.dbo.table1 newsurveys
WHERE
newsurveys.column1 = 'something'
AND newsurveys.column2 >= '2014-01-01 00:00:00'
ORDER BY [something2], [something1]

如果我运行它,我几乎立即返回两个数据表。如果我在两个select语句之间添加UNION ALL,请注释掉第一个ORDER BY并尝试再次运行它只运行并运行并运行,没有结果......

知道我做错了什么吗?这些表位于不同的数据库中是否会导致这种情况,如果有,是否有解决方法?

1 个答案:

答案 0 :(得分:1)

如果没有执行计划,找到性能问题的确切原因几乎是不可能的。以下是此行为的一个可能的解释:

  • 这两个表的[something2][something1]都有索引
  • 当您单独查询每个表时,SQL Server使用索引
  • 当你UNION ALL两个查询时,SQL Server理论上可以使用每个索引来对子查询的结果进行排序,但它不能使用索引对整个结果集进行排序,因此它必须对完整的结果集进行排序
顺便说一句,(因为你在你的标题中提到了两个,但你的帖子中只有一个),UNIONUNION ALL之间存在巨大的差异 - 前者可能会执行更糟糕的是,因为它必须从结果集中删除重复项。