oracle 查询优化的问题

rottenapple 2010-05-26 11:18:39
一张销售事实表,一年1亿多条记录,有一个时间的维度表,里面有sale_date,month,week。现在想汇总每个月的销售额
sql:

select sale_month, sum(sale_money) from sales,times
where sales.sale_time = times.sale_time and sales.sale_time > to_date('20100101','yyyymmdd')
group by sale_month

sales表,times表上分别在sale_date 建立了一个索引。

现在的问题是,由于用到了times表中的sale_month分组,sales会被全表扫描,效率不高。请问应该如何优化?
谢谢
...全文
127 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhangsong841 2010-05-30
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 rottenapple 的回复:]
引用 6 楼 jiangjian0502 的回复:

你的索引好像没有起作用的嘛,两个表字段比较的时候索引是无效的,在用的最多的字段上设置索引的话效果应该要好点吧!


前一句你说错了,比较的时候索引一样可以用的,问题是group时间就有问题了
[/Quote]
两个字段比较的意思是进行表连接吗?
where sales.sale_time = times.sale_time
象楼主的这样的表连接,索引是用不上的,这点可以从执行计划中看出,


另外可以考虑以天为单位分区。
分区最简便的方法是先建分区表,后把数据insert
半世码农 2010-05-28
  • 打赏
  • 举报
回复
学习!
hq1305018 2010-05-28
  • 打赏
  • 举报
回复
接楼上,CBO会根据表的分析情报来决定执行计划.现在的表和索引的状态,决定了使用全表SCAN而不是INDEX SCAN.
把SQL TRACE贴上来看看.
hq1305018 2010-05-28
  • 打赏
  • 举报
回复
sale_date的索引变成 sale_date DESC,试一下.

rottenapple 2010-05-28
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 zjy_ilove 的回复:]

select to_char(sale_time,'yyyy-mm') month, sum(sale_money) from sales
where sale_time > to_date('20100101','yyyymmdd')
group by to_char(sale_time,'yyyy-mm')
[/Quote]

不符合设计,我需要的是星型结构。
rottenapple 2010-05-28
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 jiangjian0502 的回复:]

你的索引好像没有起作用的嘛,两个表字段比较的时候索引是无效的,在用的最多的字段上设置索引的话效果应该要好点吧!
[/Quote]

前一句你说错了,比较的时候索引一样可以用的,问题是group时间就有问题了
suiziguo 2010-05-26
  • 打赏
  • 举报
回复
ORACLE版本?

sales.sale_time > to_date('20100101','yyyymmdd')数据占整个表比例如何?


如果是10g,ORACLE应该会选择最优CBO获取执行计划。

走索引不一定就一定快,若你想强制走索引,用hint试试,比较俩执行计划,哪个更优。
rottenapple 2010-05-26
  • 打赏
  • 举报
回复
物化视图不考虑
zjy_ilove 2010-05-26
  • 打赏
  • 举报
回复
select to_char(sale_time,'yyyy-mm') month, sum(sale_money) from sales
where sale_time > to_date('20100101','yyyymmdd')
group by to_char(sale_time,'yyyy-mm')
jiangjian0502 2010-05-26
  • 打赏
  • 举报
回复
你的索引好像没有起作用的嘛,两个表字段比较的时候索引是无效的,在用的最多的字段上设置索引的话效果应该要好点吧!
rottenapple 2010-05-26
  • 打赏
  • 举报
回复
谢谢楼上的,分区表可以自动创建么?比如新的一个月来了之后,用代码自动在表上建一个新的分区。
lzbbob1985 2010-05-26
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 rottenapple 的回复:]
在sale_time上有分区表,每年一个分区。 我是说如果从数据库表设计角度看,还可以优化么?这么点的数据量很多数据仓库都会遇到吧,看来真要用物化视图+dimension ?
[/Quote]

我们这边的处理方法

对于有些不是 非常大的表 一般采用 用月 进行分区 比如账单 之类的
对于很大的表(一天300W+ 数据 保存1年多的 ) 采用 月分区加日分区 (术语不清楚 subpartition) 不知道 对楼主有么有用
rottenapple 2010-05-26
  • 打赏
  • 举报
回复
在sale_time上有分区表,每年一个分区。 我是说如果从数据库表设计角度看,还可以优化么?这么点的数据量很多数据仓库都会遇到吧,看来真要用物化视图+dimension ?

17,086

社区成员

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

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