一个sql语句的优化问题

msnail 2003-10-23 11:37:40
我有一个sql语句,类似
select count(*) from tf_call a, tf_vip b
where
(a.calling_code = b.serv_code or a.called_code=b.serv_code)
and
a.end_date > to_date('20031010')
tf_call表中有12万数据,tf_vip中有6万条数据,tf_vip.serv_code是唯一主键,tf_call没有主键和索引。
这条语句竟然要跑几个小时!请教高手如何优化?
另:
如果不加a.end_date > to_date('20031010'),速度很快,10秒搞定
...全文
36 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
bzszp 2003-10-23
  • 打赏
  • 举报
回复
a.calling_code
a.end_date
这两个列都创建索引
pengdali 2003-10-23
  • 打赏
  • 举报
回复
a.end_date 加上索引
robixiao 2003-10-23
  • 打赏
  • 举报
回复
你可以查一下此表占用的总空间数.如果此表曾经有100M,现在只有10M,用count(*)时将对100M空间进行查询而不是10M.这就是Oracle中所谓的Block Level(块水平位)

方法1: truncate将回复水平位
方法2: 使用count(字段名)而不是count(*),此处的字段名是一个有效索引列.最好在使用此索引前先rebuild
TechnoFantasy 2003-10-23
  • 打赏
  • 举报
回复
我觉得有问题,我做过包含to_data函数的查询,时间上也就多个1、2倍。没有几个小时这么恐怖的。你试一下直接查询一个时间格式的相同的SQL语句看看。
北极星2013 2003-10-23
  • 打赏
  • 举报
回复
还是加一个函数索引吧,快很多。
zhuzhuyan 2003-10-23
  • 打赏
  • 举报
回复
加上索引,速度会大幅度提高的。尤其是查询的条件中涉及到的字段如果是索引的话,效果特别明显。
beckhambobo 2003-10-23
  • 打赏
  • 举报
回复
alter table tf_call add paitition ADD PARTITION p1 VALUES LESS THAN(to_date('20011010','yyyymmdd');
alter table tf_call add paitition ADD PARTITION p2 VALUES LESS THAN(to_date('20021010','yyyymmdd');
alter table tf_call add paitition ADD PARTITION p3 VALUES LESS THAN(to_date('20031010','yyyymmdd');
alter table tf_call add paitition ADD PARTITION p1 VALUES LESS THAN(to_date(MAXVALUE);

根本想改变sql性能,是从表结构做起,若tf_call一天可产生上万条记录,哪可用分区表方法.
至于trunc(a.end_date)可以做一个函数索引
create index ix_tf_call on tf_call(trunc(end_date));
南飞雁 2003-10-23
  • 打赏
  • 举报
回复
"如果不加a.end_date > to_date('20031010'),速度很快,10秒搞定"
那么肯定是索引起了反作用,改成
select count(*) from tf_call a, tf_vip b
where
(a.calling_code = b.serv_code or a.called_code=b.serv_code)
and trunc(a.end_date) > to_date('20031010','yyyymmdd');

17,086

社区成员

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

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