查看: 12520|回复: 15

[讨论] 请教between and 语句优化

[复制链接]
论坛徽章:
39
祖国60周年纪念徽章
日期:2009-10-09 08:28:00马上有房
日期:2015-01-12 10:57:17ITPUB社区OCM联盟徽章
日期:2014-08-27 17:33:52青年奥林匹克运动会-帆船
日期:2014-08-27 13:50:412014年世界杯参赛球队: 哥伦比亚
日期:2014-07-10 14:10:592014年世界杯参赛球队:墨西哥
日期:2014-06-24 10:38:072014年世界杯参赛球队: 加纳
日期:2014-06-23 13:12:032014年世界杯参赛球队: 美国
日期:2014-05-21 08:18:362014年世界杯参赛球队: 瑞士
日期:2014-05-20 13:38:33暖羊羊
日期:2015-02-10 17:19:24
发表于 2010-4-1 15:39 | 显示全部楼层 |阅读模式
SQL_ID  3hc6zyufvdvf3, child number 0
-------------------------------------
SELECT *   FROM mb_exportjobno  WHERE :"SYS_B_0" between STARTCODE AND
ENDCODE


Plan hash value: 3838582994

------------------------------------------------------------------------------------
| Id  | Operation         | Name           | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |                |       |       |  1999 (100)|          |
|*  1 |  TABLE ACCESS FULL| MB_EXPORTJOBNO | 30258 |  3870K|  1999   (1)| 00:00:24 |
------------------------------------------------------------------------------------

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

   1 - filter(("ENDCODE">=:SYS_B_0 AND "STARTCODE"<=:SYS_B_0))


SQL> desc mb_exportjobno;
Name                 Type         Nullable Default Comments
-------------------- ------------ -------- ------- --------
STATION_ID           VARCHAR2(20) Y                        
STARTCODE            VARCHAR2(20) Y                        
ENDCODE              VARCHAR2(20) Y                        
CREATEDATETIME       DATE         Y                        
BILL_ID              VARCHAR2(22) Y                        
REQUESTBILL_ID       VARCHAR2(22) Y                        
BILLDETAIL_ID        VARCHAR2(22) Y                        
AMOUNT               NUMBER(12,2) Y                        
EXPORTDATETIME       DATE         Y                        
UPDATEDATETIME       DATE         Y                        
EXPORTTYPE_ID        VARCHAR2(20) Y                        
MATERIEL_ID          VARCHAR2(20) Y                        
ACTIVATINGSTATUS     VARCHAR2(20) Y        'Y'              
ACTIVATINGDATETIME   DATE         Y                        
ACTIVATINGSTATION_ID VARCHAR2(20) Y        'AUTO'           
ACTIVATINGUSERNAME   VARCHAR2(20) Y        '自动激活'         
ID                   VARCHAR2(22) Y                        



INDEX_NAME        TABLE_NAME        COLUMN_NAME        COLUMN_POSITION        COLUMN_LENGTH        CHAR_LENGTH        DESCEND
MB_EXPORTJOBNO        MB_EXPORTJOBNO        STARTCODE        1        20        20        ASC
MB_EXPORTJOBNO        MB_EXPORTJOBNO        ENDCODE        2        20        20        ASC

MB_EXPORTJOBNO_KEY        MB_EXPORTJOBNO        BILLDETAIL_ID        1        22        22        ASC

建了一个复合索引在(STARTCODE,ENDCODE),试过建(STARTCODE DESC,ENDCODE)都不走索引,不知道有没有其它方法可以使查询走索引。结果集一
般为一条记录,最多不超过5条记录.
论坛徽章:
39
祖国60周年纪念徽章
日期:2009-10-09 08:28:00马上有房
日期:2015-01-12 10:57:17ITPUB社区OCM联盟徽章
日期:2014-08-27 17:33:52青年奥林匹克运动会-帆船
日期:2014-08-27 13:50:412014年世界杯参赛球队: 哥伦比亚
日期:2014-07-10 14:10:592014年世界杯参赛球队:墨西哥
日期:2014-06-24 10:38:072014年世界杯参赛球队: 加纳
日期:2014-06-23 13:12:032014年世界杯参赛球队: 美国
日期:2014-05-21 08:18:362014年世界杯参赛球队: 瑞士
日期:2014-05-20 13:38:33暖羊羊
日期:2015-02-10 17:19:24
 楼主| 发表于 2010-4-1 16:13 | 显示全部楼层
SQL_ID  7t7bfr2j07n4w, child number 0
-------------------------------------
SELECT *   FROM mb_exportjobno_T  WHERE :"SYS_B_0" between STARTCODE AND ENDCODE

Plan hash value: 3674385510

------------------------------------------------------------------------------------------------
| Id  | Operation                   | Name             | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |                  |       |       |    23 (100)|          |
|   1 |  TABLE ACCESS BY INDEX ROWID| MB_EXPORTJOBNO_T |    94 | 18518 |    23   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN          | MB_TEST1         |     2 |       |    21   (0)| 00:00:01 |
------------------------------------------------------------------------------------------------

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

   2 - access("MB_EXPORTJOBNO_T"."SYS_NC00018$">=SYS_OP_DESCEND(:SYS_B_0) AND
              "ENDCODE">=:SYS_B_0 AND "MB_EXPORTJOBNO_T"."SYS_NC00018$" IS NOT NULL)
       filter((SYS_OP_UNDESCEND("MB_EXPORTJOBNO_T"."SYS_NC00018$")<=:SYS_B_0 AND
              "ENDCODE">=:SYS_B_0))

Note
-----
   - dynamic sampling used for this statement


建了一个相同数据的表MB_EXPORTJOBNO_T,建MB_TEST1(STARTCODE DESC,ENDCODE)索引,还是会走索引的。但在生产库上不知道为什么不行,再找找原因

使用道具 举报

回复
论坛徽章:
0
发表于 2010-4-1 16:51 | 显示全部楼层
建议将主键列冗余到复合索引中,可更好提高索引命中率。

使用道具 举报

回复
论坛徽章:
0
发表于 2010-4-1 17:22 | 显示全部楼层
表分析下,或者用hint看看

使用道具 举报

回复
招聘 : 数据库管理员
论坛徽章:
7
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44祖国60周年纪念徽章
日期:2009-10-09 08:28:002010新春纪念徽章
日期:2010-03-01 11:06:13ITPUB9周年纪念徽章
日期:2010-10-08 09:31:212011新春纪念徽章
日期:2011-02-18 11:42:482014年新春福章
日期:2014-02-18 16:42:02马上有房
日期:2014-02-18 16:42:02
发表于 2010-4-1 17:48 | 显示全部楼层
yong dbms_stats重新收集一下统计信息!然后试试看。或着先查查看,这个表的统计信息是什么时候收集的

使用道具 举报

回复
论坛徽章:
311
行业板块每日发贴之星
日期:2012-07-12 18:47:29双黄蛋
日期:2011-08-12 17:31:04咸鸭蛋
日期:2011-08-18 15:13:51迷宫蛋
日期:2011-08-18 16:58:25紫蛋头
日期:2011-08-31 10:57:28ITPUB十周年纪念徽章
日期:2011-09-27 16:30:47蜘蛛蛋
日期:2011-10-20 15:51:25迷宫蛋
日期:2011-10-29 11:12:59ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41鲜花蛋
日期:2011-11-09 20:33:30
发表于 2010-4-1 17:52 | 显示全部楼层
加提示,然后比较一下效率,一致读数目。

使用道具 举报

回复
论坛徽章:
86
2015中国数据库技术大会纪念徽章
日期:2015-04-24 16:04:24马上有车
日期:2014-02-19 11:55:14马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11优秀写手
日期:2013-12-18 09:29:11日产
日期:2013-10-17 08:44:39马自达
日期:2013-08-26 16:28:022013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-23 16:55:51马上有房
日期:2014-02-19 11:55:14
发表于 2010-4-1 20:39 | 显示全部楼层
顶福哥,加Hint  /*+ index(MB_EXPORTJOBNO MB_EXPORTJOBNO) */

不过,索引最好不要跟表一个名字,容易搞混,呵呵。

使用道具 举报

回复
论坛徽章:
39
祖国60周年纪念徽章
日期:2009-10-09 08:28:00马上有房
日期:2015-01-12 10:57:17ITPUB社区OCM联盟徽章
日期:2014-08-27 17:33:52青年奥林匹克运动会-帆船
日期:2014-08-27 13:50:412014年世界杯参赛球队: 哥伦比亚
日期:2014-07-10 14:10:592014年世界杯参赛球队:墨西哥
日期:2014-06-24 10:38:072014年世界杯参赛球队: 加纳
日期:2014-06-23 13:12:032014年世界杯参赛球队: 美国
日期:2014-05-21 08:18:362014年世界杯参赛球队: 瑞士
日期:2014-05-20 13:38:33暖羊羊
日期:2015-02-10 17:19:24
 楼主| 发表于 2010-4-2 09:16 | 显示全部楼层
先试试看

使用道具 举报

回复
论坛徽章:
0
发表于 2010-4-2 14:10 | 显示全部楼层
测试库上收集了优化器统计信息了吗?感觉好像是没有,从而使用了动态采样。明显可以看到生产库和测试库优化器估算出的行数已经大不相同了,我觉得可能和peeking机制有关。你说:结果集一般为一条记录,最多不超过5条记录. 是否在生产库上在这两个时间列上收集了柱状图统计信息了呀?

使用道具 举报

回复
论坛徽章:
39
祖国60周年纪念徽章
日期:2009-10-09 08:28:00马上有房
日期:2015-01-12 10:57:17ITPUB社区OCM联盟徽章
日期:2014-08-27 17:33:52青年奥林匹克运动会-帆船
日期:2014-08-27 13:50:412014年世界杯参赛球队: 哥伦比亚
日期:2014-07-10 14:10:592014年世界杯参赛球队:墨西哥
日期:2014-06-24 10:38:072014年世界杯参赛球队: 加纳
日期:2014-06-23 13:12:032014年世界杯参赛球队: 美国
日期:2014-05-21 08:18:362014年世界杯参赛球队: 瑞士
日期:2014-05-20 13:38:33暖羊羊
日期:2015-02-10 17:19:24
 楼主| 发表于 2010-4-21 18:55 | 显示全部楼层
今天按照《oracle DBA手记》巧用索引降序扫描解决性能问题
把COST降到10以下
把语句改为
SELECT * FROM (SELECT *   FROM mb_exportjobno_T  WHERE :1 between STARTCODE AND ENDCODE)
WHERE ROWNUM<11
问过开发的,他们说结果集不会大于10条
原理还在研究中...

[ 本帖最后由 maolinxie 于 2010-4-21 18:57 编辑 ]

使用道具 举报

回复

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

本版积分规则 发表回复

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