视图
Access或SqlServer中union all 与Union 性能对比
2017-01-14 10:57:54

最近帮客户分析数据,由于数据非常多,一个月的数据都达到几百万,且数据库的字段也非常多,所以一个月的数据库用Access保存,数据库文件达到了1.6G ,如果加索引就可能超过了Access 2G的极限。

所以如下操作

1.将数据库 用多个mdb文件来保存,一个月一个mdb, 12个月,12个mdb

2.然后创建一个新的access数据库,链接到这12个mdb中的每个表

3.再建立一个联合查询 来 联接是12个月的数据,再在这个联合查询进行分析 

Select * from 1月  Union All 

Select * from 2月  Union All 

Select * from 3月  Union All 

Select * from 4月  Union All 

Select * from 5月  Union All 

Select * from 6月  Union All 

Select * from 7月  Union All 

Select * from 8月  Union All 

Select * from 9月  Union All 

Select * from 10月  Union All 

Select * from 11月  UNION ALL 

Select * from 12月;

开始 使用 Union ,发现速度奇慢,后改用 Union All ,速度很快,如果为字段加上索引,联合查询也可以用上索引

原因是:

union 和 union all 是对结果集的处理,也就是你先把两部分数据查出来(查询时使用索引)后,才轮到 union 上场, 所以都可以用上索引

但union all 这个操作只是单纯的把两个结构相等的结果集合并到一起,效率比较高。但是不执行相同纪录检查。如果用union这个操作,就会对两个结果集进行合并,同时检查是否有重复纪录,如果有重复,那么只保留一条。所以union比union all效率低

 

用UNION-ALL 替换UNION ( 如果有可能的话):

当SQL 语句需要UNION 两个查询结果集合时,这两个结果集合会以UNION-ALL 的方式被合

并, 然后在输出最终结果前进行排序. 如果用UNION ALL 替代UNION, 这样排序就不是必要

了. 效率就会因此得到提高. 需要注意的是,UNION ALL 将重复输出两个结果集合中相同记

录. 因此各位还是要从业务需求分析使用UNION ALL 的可行性. UNION 将对结果集合排序

如果是Sql server , 可以在原表或视图上加索引 来提高速度

索引视图,是解决此类问题的较佳方法

对视图创建唯一聚集索引后,结果集将存储在数据库中,就像带有聚集索引的表一样。 数据不会随基表变化而及时变化。一般的提高视图性能是通过对原表加索引实现的。

(相关查询-相关文章技巧链接):Access 传递查询和联合查询的示例