SQL Server查询使用union和带有视图的列进行更长时间的查询

时间:2017-09-02 04:02:28

标签: sql sql-server database

使用SQL Server数据库,我有一些SQL代码尝试从带有union的几个表中获取并且工作正常。

新要求是向从视图中读取的现有SQL语句添加列。我运行了各个SQL语句,它们在添加新列后运行正常,并且说话的时间比原始列长一些。

现在尝试将所有SQL语句与union一起运行,并且它将永远运行。

select 
    col 1, col 2, col3, 
    case 
       when 'ee' = (select col 5 from view1 where X.id = id) 
          then 'xx'  
          else 'yy' 
    end as newcol1
from
    X, Y, Z
where 
    condn 1 and condn 2

union

select 
    col 1, col 2, col3, 
    case 
       when 'ee' = (select col 5 from view1 where X.id = id) 
          then 'xx' 
          else 'yy' 
    end as newcol1 
from 
    X, Y, Z
where 
    condn 3 and condn 4

union

select 
    col 1, col 2, col3, 
    case 
       when 'ee' = (select col 5 from view1 where X.id = id) 
          then 'xx' 
          else 'yy' 
    end as newcol1 
from 
    X, Y, Z
where 
    condn 5 and condn 6

有关优化此查询的任何建议吗?

2 个答案:

答案 0 :(得分:1)

许多人忽略的一件事是UNION不会只返回子查询的所有行的并集,但它会检查重复项,因此可能会大大减慢查询速度。如果要返回包含重复项的三个子查询的所有结果,则应使用UNION ALL,这通常要快得多。

例如,假设您从各个子查询中获得这些结果:

Query 1   Query 2   Query 3
-------   -------   -------
1, 1, 1   1, 1, 1   4, 5, 6
2, 2, 2   3, 3, 3   7, 8, 9
1, 2, 3   3, 2, 1   1, 2, 3
3, 2, 1             3, 2, 1

使用UNION,您将获得:

1, 1, 1
2, 2, 2
1, 2, 3
3, 2, 1
3, 3, 3
4, 5, 6
7, 8, 9

并使用UNION ALL,您将获得:

1, 1, 1
2, 2, 2
1, 2, 3
3, 2, 1
1, 1, 1
3, 3, 3
3, 2, 1
4, 5, 6
7, 8, 9
1, 2, 3
3, 2, 1

如果您真的需要查询只返回三个子查询中的不同行,您可能需要在查询返回的列上添加索引,也许它们当前查询依赖于SQL Server创建的自动索引以及所做的更改优化器停止使用它们。

答案 1 :(得分:1)

我建议重写整个查询:

SELECT col 1, col 2, col3, 
    case 
       when v.col5 = 'ee'
          then 'xx'  
          else 'yy' end as newcol1
FROM X
INNER JOIN Y ON Y.??? = X.???
INNER JOIN Z ON Z.??? = X.???
LEFT OUTER JOIN view1 v ON v.id = X.id AND col5 = 'ee' 
WHERE (condn 1 and condn 2)
   OR (condn 3 and condn 3)
   OR (condn 5 and condn 6)

这样表X,Y,Z只需要读一次。