查看: 33456|回复: 17

[讨论] 多个表进行union all 进行查询,速度慢

[复制链接]
论坛徽章:
7
2013年新春福章
日期:2013-02-25 14:51:24优秀写手
日期:2014-01-15 06:00:15问答徽章
日期:2014-02-08 10:20:44马上有车
日期:2014-03-01 22:23:13沸羊羊
日期:2015-03-04 14:51:522015年新春福章
日期:2015-03-06 11:58:182016猴年福章
日期:2016-02-23 09:58:34
跳转到指定楼层
1#
发表于 2013-6-20 13:23 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式
多个表进行union all 进行查询,速度慢, union all 的表有几十个,试了选几个表生成一个视图,发现查询速度很慢。

例如:
create or replace view sb_all as
select   dzxh,  aa, bb,cc ,dd ,ee ,ff
from t1
union all
select   dzxh, aa, bb,cc ,dd ,ee ,ff
from t2

union all
select   dzxh, aa, bb,cc ,dd ,ee ,ff
from t3

union all
select   dzxh, aa, bb,cc ,dd ,ee ,ff
from t4

union all
...
select   dzxh, aa, bb,cc ,dd ,ee ,ff
from t40


union all


上述的表结构不一样,抽取一些公用的数据建立一个视图,每个表的dzxh都有索引
select * from sb_all t where t.dzxh = '123456' 发现速度很慢,单个速度查询速度挺快的。

有什么办法提高查询速度。

论坛徽章:
7
2013年新春福章
日期:2013-02-25 14:51:24优秀写手
日期:2014-01-15 06:00:15问答徽章
日期:2014-02-08 10:20:44马上有车
日期:2014-03-01 22:23:13沸羊羊
日期:2015-03-04 14:51:522015年新春福章
日期:2015-03-06 11:58:182016猴年福章
日期:2016-02-23 09:58:34
2#
 楼主| 发表于 2013-6-21 13:08 | 显示全部楼层
本帖最后由 jowenz 于 2013-6-21 13:30 编辑
nb2sfc 发表于 2013-6-20 14:32
select  .....from t1 where  t1.dzxh ='123456'  很快是吧
select  .....from t1 where  t1.dzxh ='12345 ...

只有普通用户,只有查询权限
随便选了10来表进..结果是500多条记录。。按照你的方式大约4秒左右,多次执行都4秒左右。

仍然是选了和上面一样多的表,不加条件,直接全部UNION ALL 完,在外面加查询条件就要80秒,多次执行相同SQL,最少可以降到17,18的秒子。

使用道具 举报

回复
论坛徽章:
7
2013年新春福章
日期:2013-02-25 14:51:24优秀写手
日期:2014-01-15 06:00:15问答徽章
日期:2014-02-08 10:20:44马上有车
日期:2014-03-01 22:23:13沸羊羊
日期:2015-03-04 14:51:522015年新春福章
日期:2015-03-06 11:58:182016猴年福章
日期:2016-02-23 09:58:34
3#
 楼主| 发表于 2013-6-21 13:08 | 显示全部楼层
本帖最后由 jowenz 于 2013-6-21 13:08 编辑
3833020 发表于 2013-6-20 14:35
多个表进行union all 进行查询,速度慢

速度有多慢?

使用的用户没有权限建索引

使用道具 举报

回复
论坛徽章:
7
2013年新春福章
日期:2013-02-25 14:51:24优秀写手
日期:2014-01-15 06:00:15问答徽章
日期:2014-02-08 10:20:44马上有车
日期:2014-03-01 22:23:13沸羊羊
日期:2015-03-04 14:51:522015年新春福章
日期:2015-03-06 11:58:182016猴年福章
日期:2016-02-23 09:58:34
4#
 楼主| 发表于 2013-6-21 17:17 | 显示全部楼层
本帖最后由 jowenz 于 2013-6-21 17:17 编辑
〇〇 发表于 2013-6-21 16:16
视图的执行计划往往不如表的优化程度高

如果不用视图,直接用
select *
from (
select aa, bb
from t1
union all...
select aa, bb
from t10
)where aa='xx' 也是很慢。

使用道具 举报

回复
论坛徽章:
7
2013年新春福章
日期:2013-02-25 14:51:24优秀写手
日期:2014-01-15 06:00:15问答徽章
日期:2014-02-08 10:20:44马上有车
日期:2014-03-01 22:23:13沸羊羊
日期:2015-03-04 14:51:522015年新春福章
日期:2015-03-06 11:58:182016猴年福章
日期:2016-02-23 09:58:34
5#
 楼主| 发表于 2013-6-21 21:21 | 显示全部楼层
本帖最后由 jowenz 于 2013-6-21 21:21 编辑
〇〇 发表于 2013-6-21 19:55
把where写在每个子查询呢

随便选了10来表进..结果是500多条记录。。写在子查询的方式大约4秒左右,多次执行都4秒左右。
select aa,bb
from t1 where aa='XX'
union all
...
select aa,bb
from t10 where aa='XX'
大约4秒左右,多次执行都4秒左右。

仍然是选了和上面一样多的表,不加条件,直接全部UNION ALL 完,在外面加查询条件就要80秒,多次执行相同SQL,最少可以降到17,18的秒子。
select *
from (select aa,bb
from t1
union all
...
select aa,bb
from t10 ) t  where t.aa ='XX'

使用道具 举报

回复
论坛徽章:
7
2013年新春福章
日期:2013-02-25 14:51:24优秀写手
日期:2014-01-15 06:00:15问答徽章
日期:2014-02-08 10:20:44马上有车
日期:2014-03-01 22:23:13沸羊羊
日期:2015-03-04 14:51:522015年新春福章
日期:2015-03-06 11:58:182016猴年福章
日期:2016-02-23 09:58:34
6#
 楼主| 发表于 2013-6-24 13:23 | 显示全部楼层
本帖最后由 jowenz 于 2013-6-24 13:34 编辑
newkid 发表于 2013-6-22 22:49
顶楼的都是些简单查询,可能有些复杂条件被楼主隐藏了。

子查询不复杂,没有使用条件,都是直接Union all,
只是表分散了,想分散中的一相同的字段共同成一张大表。


倒是在可能在外面写法可能有问题


例如:我的
select * from
(select aa, bb
from t1
union all
...
select aa, bb
from t10
union all ) t
where t.aa = (select   z.aa from dj z where z.dm = '123456') 或者select * from
(select aa, bb
from t1
union all
...
select aa, bb
from t10
union all ) t
where t.aa in  (select   z.aa from dj z where z.dm = '123456')
或者
select * from
(select aa, bb
from t1
union all
...
select aa, bb
from t10
union all ) t, dj z
where t.aa = z.aa

and z.dm = '123456'

这样查起来,第一次一般1分钟左右,第二次执行就是18秒左右。

假如 select  aa from dj where dj.dm ='123456'  结果aa='123'
但是换成下面这样写,就相对固定,基本上是4秒左右。
select * from
(select aa, bb
from t1
union all
...
select aa, bb
from t10
union all ) t
where t.aa = '123'

其实这样写也可以,就是查询麻烦,每次都要先查出 DM 对应的AA的值,再替换上面的SQL中
我发现好像是我错了,最初原来写的慢where t.aa = '123',其实我想真实写法where t.aa = (select   z.aa from dj z where z.dm = '123456') 查询慢,
我一直以为where t.aa = (select   z.aa from dj z where z.dm = '123456') 只有一个记录,和where t.aa = '123'一样的,原来差别这么大。

使用道具 举报

回复
论坛徽章:
7
2013年新春福章
日期:2013-02-25 14:51:24优秀写手
日期:2014-01-15 06:00:15问答徽章
日期:2014-02-08 10:20:44马上有车
日期:2014-03-01 22:23:13沸羊羊
日期:2015-03-04 14:51:522015年新春福章
日期:2015-03-06 11:58:182016猴年福章
日期:2016-02-23 09:58:34
7#
 楼主| 发表于 2013-6-25 13:05 | 显示全部楼层
lucky_sunny 发表于 2013-6-25 08:35
这个首先是设计问题,如有可能应该重新考虑一下。
如果无法改变,考虑如何进行谓词推进,把条件推进到视图 ...

没有办法,如何进行谓词推进? where t.aa = '123'  这个123 没办法直接获取,要通过查询表获取的。

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表