日期:2014-05-18  浏览次数:20595 次

视图使用union all后出现的奇怪问题(高手请进,点这,说的就是你)
近日碰到一个非常令我郁闷的问题。

我们的程序一直都运行得好好的,但是最近开始速度越来越慢。排除了服务器本身的问题。经过调试,后来发现程序每次都在执行一条SQL语句时非常慢。用查询分析器试了下,也是很慢,因此知道是数据库的问题。

这条SQL是从一个视图里查询,并left   join   了另1个表。
我直接在查询分析器里执行视图,发现也很慢。这个视图由7个内连接的查询union合成。多次测试发现是某一个内连接查询很慢,应该是由于这个内连接的表的数据量日益增大的缘故,因此在连接的列上建立了索引。之后单独执行这个内连接查询,或其他6个内连接的union查询,都很快,但把这个内连接查询,与其他任何一个查询union时都还是很慢。

我们的这个视图里不会有重复记录,因此把union全部换成union   all,果然刷的一下就全出来了。

本来以为这样就解决问题了,可是没想到,出现了一个很怪的问题。
我的那条SQL语句用不了了。我在查询分析器里执行得到这样的错误:

The   table   'b '   is   an   inner   member   of   an   outer-join   clause.   This   is   not   allowed   if   the   table   also   participates   in   a   regular   join   clause.  

大致意思是外连接和内连接不能混用。可是我的SQL里只有一个left   join,inner   join是写在视图的创建脚本里的。奇怪的是我用union时是正常的,换成union   all就无法这样用了。

我的视图大致是这样的
create   view   v_view1
select   a.*,b.*   from   a   inner   join   b   on   a.colume1=b.colume1
union   all
select   a.*,c.*   from   a   inner   join   c   on   a.colume1=c.colume1
union   all
...
...
...
(总共7个)


然后SQL语句是select   a.*,aa.*   from   v_view1   a   left   join   aa   on   a.colume1=aa.colume1


如果我将left   join换成inner   join则没问题,但是结果不是我想要的。

于是现在这个问题我不知道怎么办了。假如不用union   all那么程序将很慢。而且还会越来越慢。但是用了的话,这个SQL又用不了。难不成非要我用两条SQL来查询并拼凑结果?

------解决方案--------------------
用类似这样一个视图来替换

create view v_view2
select a.*,b.* from a inner join b on a.colume1=b.colume1 left join aa on a.colume1=aa.colume1
union all
select a.*,c.* from a inner join c on a.colume1=c.colume1 left join aa on a.colume1=aa.colume1
union all
...
...
...
(总共7个)


查询语句就可以用
select * from v_view2

------解决方案--------------------
视图改为这样试试

create view v_view1
select a.* ,b.*,aa.* from a
inner join
(
select * from b
union all
select * from c
-----这里7个
)b
on a.colume1=b.colume1
left join aa
on a.colume1=aa.colume1

go

select * from v_view1