group by 没用索引 速度很慢

goldjincheng 2009-12-03 04:24:50
SELECT a.id,
a.file,
a.date,
COUNT(DECODE(a.status, 'C', 'X', NULL)) C_COUNT,
COUNT(DECODE(a.status, 'B', 'X', NULL)) B_COUNT,
COUNT(DECODE(a.status, 'V', 'X', NULL)) V_COUNT
FROM tablea a,
tableb b
WHERE 1 = 1
AND a.id= b.id
GROUP BY a.id,
a.file,
a.date

上面的语句 a.id, a.file, a.date都是索引,两个表的数据量都在百万
执行计划:
SELECT STATEMENT, GOAL = CHOOSE 11861 945 29295
SORT GROUP BY 11861 945 9295
HASH JOIN 5316 1583041 49074271
TABLE ACCESS FULL tablea 2061 456765 6851475
TABLE ACCESS FULL tableb 1866 1583041 25328656


目前的执行速度很慢,哪位帮忙看看,怎么样才能用上索引,或者能提高速度,小弟先谢谢了
...全文
956 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhengzeng 2009-12-23
  • 打赏
  • 举报
回复
联系QQ号363017992
ojuju10 2009-12-23
  • 打赏
  • 举报
回复
分别在ta和tb中的Id上建立索引
changhe325 2009-12-23
  • 打赏
  • 举报
回复
mark
crazylaa 2009-12-23
  • 打赏
  • 举报
回复
楼主建的不是联合索引吧?group by 后面那3个字段建个联合索引看看。
hujun1024 2009-12-23
  • 打赏
  • 举报
回复
1.tablea上建索引:create index xx on tablea(id);
2.tableb上建索引:create index xx2 on tableb(id);

SELECT a.id,
a.file,
a.date,
COUNT(DECODE(a.status, 'C', 'X', NULL)) C_COUNT,
COUNT(DECODE(a.status, 'B', 'X', NULL)) B_COUNT,
COUNT(DECODE(a.status, 'V', 'X', NULL)) V_COUNT
FROM tablea a
inner join tableb b on a.id= b.id
WHERE 1 = 1
GROUP BY a.id,
a.file,
a.date
hhuxyb 2009-12-08
  • 打赏
  • 举报
回复
hint 强制走索引
lixinbill 2009-12-08
  • 打赏
  • 举报
回复
tableb 上的id字段建立索引。只要你的id的唯一性足够,很快的。
vc555 2009-12-06
  • 打赏
  • 举报
回复
你的索引不会是分开在每个列上建的吧?
这样做:
1.tablea上建联合索引:create index xx on tablea(id,file,date);
2.tableb上建索引:create index xx2 on tableb(id);

再执行下,把执行计划贴出来,正确的话两个表都可以走INDEX FAST FULL SCAN
xlfd2005 2009-12-06
  • 打赏
  • 举报
回复
group by 还需要索引么,貌似只有select 的时候才走索引吧,
zhengzeng 2009-12-04
  • 打赏
  • 举报
回复
tableb 上的id字段建立索引。只要你的id的唯一性足够,很快的。
Dave 2009-12-03
  • 打赏
  • 举报
回复
[Quote=引用楼主 goldjincheng 的回复:]
执行计划:
SELECT STATEMENT, GOAL = CHOOSE 11861 945 29295
SORT GROUP BY                   11861    945 9295
  HASH JOIN                   5316 1583041 49074271
  TABLE ACCESS FULL tablea           2061 456765 6851475
  TABLE ACCESS FULL tableb           1866 1583041 25328656


目前的执行速度很慢,哪位帮忙看看,怎么样才能用上索引,或者能提高速度,小弟先谢谢了
[/Quote]

从执行计划看,没有走索引而是全表扫描,试试hint 强制索引

SELECT /*+ index(table_name,index_name) */a.id,
/*+ index(table_name,index_name) */a.file,
/*+ index(table_name,index_name) */a.date,
COUNT(DECODE(a.status, 'C', 'X', NULL)) C_COUNT,
COUNT(DECODE(a.status, 'B', 'X', NULL)) B_COUNT,
COUNT(DECODE(a.status, 'V', 'X', NULL)) V_COUNT
FROM tablea a,
tableb b
WHERE 1 = 1
AND a.id= b.id
GROUP BY a.id,
a.file,
a.date



------------------------------------------------------------------------------
Blog: http://blog.csdn.net/tianlesoftware
网上资源: http://tianlesoftware.download.csdn.net
相关视频:http://blog.csdn.net/tianlesoftware/archive/2009/11/27/4886500.aspx
Q Q 群:62697716

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧