查看: 6246|回复: 23

[性能调整] 问个简单的SQL语句优化问题

[复制链接]
论坛徽章:
3
每周论坛发贴之星
日期:2009-11-29 01:35:342010广州亚运会纪念徽章:棋类
日期:2011-02-19 23:59:33ITPUB学员
日期:2011-05-04 17:44:51
发表于 2012-1-30 14:35 | 显示全部楼层 |阅读模式
下面这个SQL,因为要用到两个时间差不超过1分钟,所以两次用了一个函数:abs((CAST(p.ttime AS DATE) - CAST(c.ttime AS DATE))),而这两个表的数据都很大,一个1千万,一个6千万(都是分区表,按小时),这样用的话,会导致全表的扫描,而没法使用索引。on条件中的这个语句还可以改成一个括号括起来的or语句,但是select中的min怎么修改比较好呢?一时想不出好的办法,系统提供点建议。

select p.record_file_index RECORD_FILE_INDEX,
         c.lac LAC,
         c.cell_id CI,
         p.imsi IMSI,
         p.tmsi TMSI,
         p.frame FRAME,
         p.ttime TTIME,
         p.dtime DTIME,
         min(abs((CAST(p.ttime AS DATE) - CAST(c.ttime AS DATE)))) MINTIME
    from paging_temp_120127 p
    left join call_start_120127 c
      on (p.imsi = c.imsi or p.tmsi = c.tmsi)
     and abs(cast(p.ttime as date) - cast(c.ttime as date)) * 24 * 60 < 1
   where p.ttime >= TIMESTAMP'2012-01-27 23:00:00'
     and p.ttime < TIMESTAMP'2012-01-28 00:00:00'
     and c.ttime >= TIMESTAMP'2012-01-27 23:00:00'
     and c.ttime < TIMESTAMP'2012-01-28 00:00:00'
   group by p.record_file_index,
            c.lac,
            c.cell_id,
            p.imsi,
            p.tmsi,
            p.frame,
            p.ttime,
            p.dtime

论坛徽章:
51
ITPUB十周年纪念徽章
日期:2011-11-01 16:25:22铁扇公主
日期:2012-02-21 15:03:13最佳人气徽章
日期:2012-03-13 17:39:18ITPUB季度 技术新星
日期:2012-05-22 15:10:11ITPUB 11周年纪念徽章
日期:2012-10-09 18:13:332013年新春福章
日期:2013-02-25 14:51:24ITPUB社区12周年站庆徽章
日期:2013-08-12 09:34:36itpub13周年纪念徽章
日期:2014-09-28 10:55:55
发表于 2012-1-30 17:06 | 显示全部楼层
怎么也得把执行计划贴出来把~你的过滤条件的选择性看着还可以啊

使用道具 举报

回复
论坛徽章:
17
2009日食纪念
日期:2009-07-22 09:30:00马上有车
日期:2014-12-25 09:26:21奥运会纪念徽章:马术
日期:2012-09-06 17:58:19奥运会纪念徽章:举重
日期:2012-08-17 11:49:28奥运会纪念徽章:花样游泳
日期:2012-08-11 17:43:33奥运会纪念徽章:帆船
日期:2012-07-19 19:26:52奥运会纪念徽章:现代五项
日期:2012-06-25 11:12:17奥运会纪念徽章:游泳
日期:2012-06-13 11:58:41灰彻蛋
日期:2012-06-12 15:30:12茶鸡蛋
日期:2012-06-11 16:16:43
发表于 2012-1-30 18:39 | 显示全部楼层
按小时分是怎么分的? 1小时一个区? 一个区中有多少数据?表中一共有多少数据?
等具体描述

使用道具 举报

回复
论坛徽章:
2
2012新春纪念徽章
日期:2012-01-04 11:54:26ITPUB 11周年纪念徽章
日期:2012-10-09 18:09:19
发表于 2012-1-30 20:14 | 显示全部楼层
这个简单么..

使用道具 举报

回复
论坛徽章:
3
每周论坛发贴之星
日期:2009-11-29 01:35:342010广州亚运会纪念徽章:棋类
日期:2011-02-19 23:59:33ITPUB学员
日期:2011-05-04 17:44:51
 楼主| 发表于 2012-2-1 13:33 | 显示全部楼层
本帖最后由 goldfishes 于 2012-2-1 13:35 编辑


iori809 发表于 2012-1-30 17:06

怎么也得把执行计划贴出来把~你的过滤条件的选择性看着还可以啊


执行计划如下,表是按小时分区的,两个表每小时数据9点多和晚上20-22点这三个分区是平均值的两倍,1-5点之间数据是品均值的一半,其它的基本上都是平均分布的。
分析后.png


使用道具 举报

回复
论坛徽章:
51
ITPUB十周年纪念徽章
日期:2011-11-01 16:25:22铁扇公主
日期:2012-02-21 15:03:13最佳人气徽章
日期:2012-03-13 17:39:18ITPUB季度 技术新星
日期:2012-05-22 15:10:11ITPUB 11周年纪念徽章
日期:2012-10-09 18:13:332013年新春福章
日期:2013-02-25 14:51:24ITPUB社区12周年站庆徽章
日期:2013-08-12 09:34:36itpub13周年纪念徽章
日期:2014-09-28 10:55:55
发表于 2012-2-1 13:35 | 显示全部楼层
goldfishes 发表于 2012-2-1 13:33
执行计划如下,表是按小时分区的,两个表每小时数据9点多和晚上20-22点这三个分区是平均值的两倍,1-5点 ...

图片无法显示

使用道具 举报

回复
论坛徽章:
3
每周论坛发贴之星
日期:2009-11-29 01:35:342010广州亚运会纪念徽章:棋类
日期:2011-02-19 23:59:33ITPUB学员
日期:2011-05-04 17:44:51
 楼主| 发表于 2012-2-1 13:42 | 显示全部楼层
本帖最后由 goldfishes 于 2012-2-1 13:45 编辑

我尝试过把语句改成这样
select p.record_file_index RECORD_FILE_INDEX,
         c.lac LAC,
         c.cell_id CI,
         p.imsi IMSI,
         p.tmsi TMSI,
         p.frame FRAME,
         p.ttime TTIME,
         p.dtime DTIME,
         min(abs((CAST(p.ttime AS DATE) - CAST(c.ttime AS DATE)))) MINTIME
    from paging_temp_120130 p
    left join call_start_120130 c
      on (p.imsi = c.imsi or p.tmsi = c.tmsi)
     and p.ttime < c.ttime + 1/24/60 and p.ttime > c.ttime - 1/24/60   
   where p.ttime >= TIMESTAMP'2012-01-30 00:00:00'
     and p.ttime < TIMESTAMP'2012-01-30 01:00:00'
     and c.ttime >= TIMESTAMP'2012-01-30 00:00:00'
     and c.ttime < TIMESTAMP'2012-01-30 01:00:00'
   group by p.record_file_index,
            c.lac,
            c.cell_id,
            p.imsi,
            p.tmsi,
            p.frame,
            p.ttime,
            p.dtime
结果执行计划如下,执行时间还变长了,执行计划里面变成了merge join,主要是排序了,估计时间就长了。PS:表都是分析过的
改后.JPG





使用道具 举报

回复
论坛徽章:
3
每周论坛发贴之星
日期:2009-11-29 01:35:342010广州亚运会纪念徽章:棋类
日期:2011-02-19 23:59:33ITPUB学员
日期:2011-05-04 17:44:51
 楼主| 发表于 2012-2-1 13:43 | 显示全部楼层
iori809 发表于 2012-2-1 13:35
图片无法显示

现在看看?刚才附件没传好,现在好了

使用道具 举报

回复
论坛徽章:
3
每周论坛发贴之星
日期:2009-11-29 01:35:342010广州亚运会纪念徽章:棋类
日期:2011-02-19 23:59:33ITPUB学员
日期:2011-05-04 17:44:51
 楼主| 发表于 2012-2-1 13:44 | 显示全部楼层
goldfishes 发表于 2012-2-1 13:42
我尝试过把语句改成这样
select p.record_file_index RECORD_FILE_INDEX,
         c.lac LAC,

修改这个本来是想走索引连接两个表看看是不是快点的,结果oracle还是选择了全表,还选择的merge join

使用道具 举报

回复
论坛徽章:
3
每周论坛发贴之星
日期:2009-11-29 01:35:342010广州亚运会纪念徽章:棋类
日期:2011-02-19 23:59:33ITPUB学员
日期:2011-05-04 17:44:51
 楼主| 发表于 2012-2-1 13:50 | 显示全部楼层
有个更正,paging_temp_120130 表是60万行, call_start_120130 表是6000万行,开始说前一个表1000万行有误。可能大家也发现了,Hash join的时候oracle一直用的大表做的驱动表,我也不是很能理解,按理说小表和大表的过滤的筛选性应该是差不多的,应该还是小表做驱动表才对。

使用道具 举报

回复

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

本版积分规则 发表回复

SACC2019中国系统架构师大会

【数字转型 架构演进】SACC2019中国系统架构师大会,7折限时优惠重磅来袭!
2019年10月31日~11月2日第11届中国系统架构师大会(SACC2019)将在北京隆重召开。四大主线并行的演讲模式,1个主会场、20个技术专场、超千人参与的会议规模,100+来自互联网、金融、制造业、电商等领域的嘉宾阵容,将为广大参会者提供一场最具价值的技术交流盛会。

限时七折期:2019年8月31日前


----------------------------------------

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