使用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
有关优化此查询的任何建议吗?
答案 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只需要读一次。