视图使用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