查看: 2930|回复: 10

大家看看这个sql还有优化的余地吗

[复制链接]
论坛徽章:
44
2015年新春福章
日期:2015-03-06 11:57:312012新春纪念徽章
日期:2012-02-13 15:10:582012新春纪念徽章
日期:2012-02-13 15:10:582012新春纪念徽章
日期:2012-02-13 15:10:582012新春纪念徽章
日期:2012-02-13 15:10:582012新春纪念徽章
日期:2012-01-04 11:53:29ITPUB十周年纪念徽章
日期:2011-11-01 16:23:26管理团队成员
日期:2011-05-07 01:45:082011新春纪念徽章
日期:2011-01-25 15:42:562012新春纪念徽章
日期:2012-02-13 15:10:58
发表于 2009-9-9 13:20 | 显示全部楼层 |阅读模式
C_TPD_CDL_LC_1001_20090908表保存一天24小时的数据,每小时数据在40万左右,总共800多万
这个表按照scan_start_time字段进行分区,每小时一个分区
在(scan_start_time,int_id)上创建唯一索引
在msisdn上创建索引,msisdn数据每条都是不同的
os:SUN
ORACLE11G
内存8G
SGA:4G
PGA:2.5G


做以下sql查询时间在30,40秒左右
执行了trace如下:

SQL> select * from C_TPD_CDL_LC_1001_20090908 where  msisdn=13332410169
  2  and scan_start_time=to_date('2009-09-08 19:00:00','yyyy-mm-dd hh24:mi:ss') ;

执行计划
----------------------------------------------------------
Plan hash value: 1055829562

---------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                          | Name                       | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
---------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                   |                            |     1 |  4346 |     0   (0)| 00:00:01 |       |       |
|   1 |  PARTITION RANGE SINGLE            |                            |     1 |  4346 |     0   (0)| 00:00:01 |    20 |    20 |
|*  2 |   TABLE ACCESS BY LOCAL INDEX ROWID| C_TPD_CDL_LC_1001_20090908 |     1 |  4346 |     0   (0)| 00:00:01 |    20 |    20 |
|*  3 |    INDEX RANGE SCAN                | C_TPD_CDL_LC_1001_20090908 |     1 |       |     0   (0)| 00:00:01 |    20 |    20 |
---------------------------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - filter("MSISDN"=13332410169)
   3 - access("SCAN_START_TIME"=TO_DATE(' 2009-09-08 19:00:00', 'syyyy-mm-dd hh24:mi:ss'))
论坛徽章:
120
现任管理团队成员
日期:2011-05-07 01:45:08乌索普
日期:2019-02-14 23:54:04
发表于 2009-9-9 13:28 | 显示全部楼层
来个10046看看,到底哪步比较慢
我觉得最好是能走unique scan.但是你一小时插入40w行,在加索引把影响插入吧~

[ 本帖最后由 zergduan 于 2009-9-9 13:32 编辑 ]

使用道具 举报

回复
论坛徽章:
27
会员2007贡献徽章
日期:2007-09-26 18:42:102011新春纪念徽章
日期:2011-02-18 11:43:342010广州亚运会纪念徽章:排球
日期:2011-03-03 12:19:332010广州亚运会纪念徽章:篮球
日期:2011-03-10 14:25:06ITPUB十周年纪念徽章
日期:2011-09-27 16:30:47ITPUB十周年纪念徽章
日期:2011-11-01 16:21:15灰彻蛋
日期:2011-12-28 16:56:322012新春纪念徽章
日期:2012-01-04 11:50:44迷宫蛋
日期:2012-03-09 15:14:20蜘蛛蛋
日期:2012-03-26 09:46:32
发表于 2009-9-9 13:36 | 显示全部楼层
如果msisdn数据每条都是不同的
那么 msisdn 全局索引就可以了

使用道具 举报

回复
论坛徽章:
136
ITPUB年度最佳技术回答奖
日期:2010-06-12 13:17:14现代
日期:2013-10-02 14:53:59路虎
日期:2013-11-22 12:26:182014年新春福章
日期:2014-02-18 16:42:02马上有房
日期:2014-02-18 16:42:02马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上加薪
日期:2014-02-19 11:55:14
发表于 2009-9-9 13:36 | 显示全部楼层
在msisdn上创建索引,msisdn数据每条都是不同的

你好好看看,怎么没走msisdn上的索引

使用道具 举报

回复
论坛徽章:
120
现任管理团队成员
日期:2011-05-07 01:45:08乌索普
日期:2019-02-14 23:54:04
发表于 2009-9-9 13:37 | 显示全部楼层
原帖由 棉花糖ONE 于 2009-9-9 13:36 发表
在msisdn上创建索引,msisdn数据每条都是不同的

你好好看看,怎么没走msisdn上的索引

全局就可以建立unique索引了,但以后维护就麻烦了..

使用道具 举报

回复
论坛徽章:
136
ITPUB年度最佳技术回答奖
日期:2010-06-12 13:17:14现代
日期:2013-10-02 14:53:59路虎
日期:2013-11-22 12:26:182014年新春福章
日期:2014-02-18 16:42:02马上有房
日期:2014-02-18 16:42:02马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上加薪
日期:2014-02-19 11:55:14
发表于 2009-9-9 13:39 | 显示全部楼层

回复 #5 zergduan 的帖子

我没说要做全局索引,它这地方已经限制分区了,直接这个索引local就ok了

使用道具 举报

回复
论坛徽章:
0
发表于 2009-9-9 13:48 | 显示全部楼层
msisdn数据每条都是不同的
这种情况下,你查询不需要再加上时间了吧

如果时间一定需要,那你就建一个复合索引:
create unique index on C_TPD_CDL_LC_1001_20090908 (msisdn, scan_start_time)

再做一下statistic数据收集

使用道具 举报

回复
论坛徽章:
44
2015年新春福章
日期:2015-03-06 11:57:312012新春纪念徽章
日期:2012-02-13 15:10:582012新春纪念徽章
日期:2012-02-13 15:10:582012新春纪念徽章
日期:2012-02-13 15:10:582012新春纪念徽章
日期:2012-02-13 15:10:582012新春纪念徽章
日期:2012-01-04 11:53:29ITPUB十周年纪念徽章
日期:2011-11-01 16:23:26管理团队成员
日期:2011-05-07 01:45:082011新春纪念徽章
日期:2011-01-25 15:42:562012新春纪念徽章
日期:2012-02-13 15:10:58
 楼主| 发表于 2009-9-9 13:48 | 显示全部楼层
INDEX RANGE SCAN这个不是走msisdn索引吗?

使用道具 举报

回复
论坛徽章:
44
2015年新春福章
日期:2015-03-06 11:57:312012新春纪念徽章
日期:2012-02-13 15:10:582012新春纪念徽章
日期:2012-02-13 15:10:582012新春纪念徽章
日期:2012-02-13 15:10:582012新春纪念徽章
日期:2012-02-13 15:10:582012新春纪念徽章
日期:2012-01-04 11:53:29ITPUB十周年纪念徽章
日期:2011-11-01 16:23:26管理团队成员
日期:2011-05-07 01:45:082011新春纪念徽章
日期:2011-01-25 15:42:562012新春纪念徽章
日期:2012-02-13 15:10:58
 楼主| 发表于 2009-9-9 13:49 | 显示全部楼层
create index IC_TPD_CDL_LC_1001_20090908 on C_TPD_CDL_LC_1001_20090908 (MSISDN);
msisdn上的索引是按照以上sql创建的

使用道具 举报

回复
论坛徽章:
120
现任管理团队成员
日期:2011-05-07 01:45:08乌索普
日期:2019-02-14 23:54:04
发表于 2009-9-9 13:51 | 显示全部楼层
3 - access("SCAN_START_TIME"=TO_DATE(' 2009-09-08 19:00:00', 'syyyy-mm-dd hh24:mi:ss'))
走的是在(scan_start_time,int_id)上创建唯一索引

使用道具 举报

回复

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

本版积分规则 发表回复

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