查看: 10305|回复: 5

[性能调整] 11G的sql优化问题TABLE ACCESS FULL不走索引

[复制链接]
论坛徽章:
0
发表于 2010-12-5 22:57 | 显示全部楼层 |阅读模式
select to_char(tracedata0_.RECEIVE_DATE, 'yyyy-MM-dd') as col_0_0_, tracedata0_.CONTENT_TYPE as col_1_0_, count(*) as col_2_0_
from TRACE_DATA tracedata0_
where 1=1 and tracedata0_.RECEIVE_DATE>=:1 and tracedata0_.RECEIVE_DATE<:2 group by tracedata0_.CONTENT_TYPE , to_char(tracedata0_.RECEIVE_DATE, 'yyyy-MM-dd')
由于先前在另个查询语句用到CONDITION_ID,PROJECT_ID,RECEIVE_DATE,我已经做的复合索引RECEIVE_DATE IDX_COND_PROJ_RECEDATE(CONDITION_ID,PROJECT_ID,RECEIVE_DATE),但是这个select还是为何还是走TABLE ACCESS FULL而不走索引,询问下高手
论坛徽章:
1
2011新春纪念徽章
日期:2011-01-04 10:36:46
发表于 2010-12-5 23:08 | 显示全部楼层
RECEIVE_DATE不是索引的LEADING COLUMN,要使用索引除非前面的两个的DISTINCT值很少的时候才可能用INDEX SKIP SCAN,否则就用不到的。

使用道具 举报

回复
论坛徽章:
0
 楼主| 发表于 2010-12-6 16:17 | 显示全部楼层
后来语句我做了跟踪,发现是走索引的,但性能不佳,但advistor又提示最好为RECEIVE_DATE建立独立索引
Id  | Operation                     | Name                         | Rows  | Bytes
| Cost (%CPU)| Time         |

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

|   0 | SELECT STATEMENT             |                                 |     3 |    72
|    68   (2)| 00:00:01 |

|   1 |  HASH GROUP BY                     |                                 |     3 |    72
|    68   (2)| 00:00:01 |

|   2 |   TABLE ACCESS BY INDEX ROWID| TRACE_DATA                 |    10 |   240
|    67   (0)| 00:00:01 |

|*  3 |    INDEX SKIP SCAN             | IDX_CONID_PROID_RECE_DATE |     1 |
|    66   (0)| 00:00:01 |
怎么优化比较好,性能差

使用道具 举报

回复
论坛徽章:
7
授权会员
日期:2010-12-06 19:50:26数据库板块每日发贴之星
日期:2011-09-03 01:01:01迷宫蛋
日期:2011-09-08 16:30:08ITPUB十周年纪念徽章
日期:2011-11-01 16:24:04玉石琵琶
日期:2012-02-21 15:04:38最佳人气徽章
日期:2012-03-13 17:39:18
发表于 2010-12-6 16:22 | 显示全部楼层
analyze table

使用道具 举报

回复
论坛徽章:
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-12-7 09:33 | 显示全部楼层
RECEIVE_DATE不是前导列,如果使用,只能是index skip scan,如果前导列的选择度高,那效率可能会比较差。

再建一个索引吧。

使用道具 举报

回复
招聘 : 数据库管理员
论坛徽章:
66
ITPUB元老
日期:2005-07-16 18:49:11授权会员
日期:2005-10-30 17:05:33ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44现任管理团队成员
日期:2011-05-07 01:45:08版主3段
日期:2012-05-15 15:24:11
发表于 2010-12-7 09:39 | 显示全部楼层
原帖由 sainker 于 2010-12-5 22:57 发表
select to_char(tracedata0_.RECEIVE_DATE, 'yyyy-MM-dd') as col_0_0_, tracedata0_.CONTENT_TYPE as col_1_0_, count(*) as col_2_0_
from TRACE_DATA tracedata0_
where 1=1 and tracedata0_.RECEIVE_DATE>=:1 and tracedata0_.RECEIVE_DATE


tracedata0_.RECEIVE_DATE>=:1 and tracedata0_.RECEIVE_DATE<:2
这个地方要改成:
tracedata0_.RECEIVE_DATE>=to_date(:1,'yyyy-mm-dd') and tracedata0_.RECEIVE_DATE<to_date(:2,'yyyy-mm-dd')
如果不改,它会对数据类型进行隐式转换

使用道具 举报

回复

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

本版积分规则 发表回复

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