查看: 33380|回复: 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' 发现速度很慢,单个速度查询速度挺快的。

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

论坛徽章:
4
奥运会纪念徽章:射箭
日期:2012-07-20 08:53:47奥运会纪念徽章:帆船
日期:2012-07-26 15:46:49夏利
日期:2013-09-04 11:34:22林肯
日期:2013-10-14 14:23:47
2#
发表于 2013-6-20 14:32 | 只看该作者
select  .....from t1 where  t1.dzxh ='123456'  很快是吧
select  .....from t1 where  t1.dzxh ='123456'
union all
select  .....from t2 where  t1.dzxh ='123456'
union all
select  .....from t3 where  t1.dzxh ='123456'
....随便选几个查询速度 怎么样?
另外物化视图可以 用么?

使用道具 举报

回复
求职 : 数据库开发
论坛徽章:
59
妮可·罗宾
日期:2017-04-29 10:55:21弗兰奇
日期:2018-08-31 20:09:41ITPUB18周年纪念章
日期:2019-03-12 14:03:4619周年集字徽章-周
日期:2019-09-29 10:43:3420周年集字徽章-20	
日期:2020-10-28 14:48:18
3#
发表于 2013-6-20 14:35 | 只看该作者
多个表进行union all 进行查询,速度慢

速度有多慢?

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 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
5#
 楼主| 发表于 2013-6-21 13:08 | 只看该作者
本帖最后由 jowenz 于 2013-6-21 13:08 编辑
3833020 发表于 2013-6-20 14:35
多个表进行union all 进行查询,速度慢

速度有多慢?

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

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
6#
发表于 2013-6-21 16:16 | 只看该作者
视图的执行计划往往不如表的优化程度高

使用道具 举报

回复
论坛徽章:
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-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' 也是很慢。

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
8#
发表于 2013-6-21 19:55 | 只看该作者
jowenz 发表于 2013-6-21 17:17
如果不用视图,直接用
select *
from (

把where写在每个子查询呢

使用道具 举报

回复
论坛徽章:
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
9#
 楼主| 发表于 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'

使用道具 举报

回复
论坛徽章:
519
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
10#
发表于 2013-6-21 23:06 | 只看该作者
把条件写在外面,和分别写在里面,计划都是什么样的?照理说查询谓词可以自动推入到里面。

使用道具 举报

回复

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

本版积分规则 发表回复

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