如何优化这样的sql查询?

[复制链接]
查看11 | 回复2 | 2007-1-25 16:51:36 | 显示全部楼层 |阅读模式
[PHP] desc t_d

c_id

c_date

c_value

desc t_s

c_no

c_start
...............
[/PHP]
需求是:
要取出t_d中id=1 和 id=2 的最大c_date所对应的c_value值,并且把表t_s中对应c_no=50的c_start最大的值取出来。
因为表t_d的数据量很大,这样的查询应该怎么优化才好。
[PHP]select
tp1.c_value c_p,
tp2.c_value c_hz,
tt.c_startc_start
from
(select max(c_date) m_date,c_id from t_d group by c_id having c_id = 1) tp3,
(select max(c_date) m_date,c_id from t_d group by c_id having c_id = 2)tp4,
t_d tp1,
t_d tp2,
t_stt,
(select max(c_start) m_start,c_no from t_s group by c_no having c_no = 50) tt1
where
(tt.c_start=tt1.m_start)
and
( tp1.c_id=tp3.c_id and tp1.c_date = tp3.m_date)
and
( tp2.c_id=tp4.c_id and tp2.c_date = tp4.m_date)
and rownum<2
;
[/PHP]
这个sql至少需要执行10分钟,作为应用这样的时间是让人无法忍受的,怎么优化才能提高速度??
回复

使用道具 举报

千问 | 2007-1-25 16:51:36 | 显示全部楼层
有这样两个疑问:
1,你要取得的这3个值是不相关的吧?!那为什么不写3个SQL来分别实现,非要用一个SQL去写,让好几个表去关联,能不慢吗?
2.group by的执行顺序问题:应该是先执行where条件过滤,然后group by分组,在执行sum()等分组统计,最后再执行having的吧?!这样你为什么要使用having c_id = 2 让它最后去限定,而不使用where c_id=2让它一开始就限定从而减少行呢?!
可不可以这样写:
select c_value from t_d where rowid=
(
select rid from
(
select rowid rid,row_number() over(order by c_date desc) r
from t_d where id=1
)
where r=1
)
回复

使用道具 举报

千问 | 2007-1-25 16:51:36 | 显示全部楼层
to 情未浓却已逝




惭愧了,只是有需求这样做,就一味作下去没有想到更简单的方法,受教了,楼上的解说还是很有用的。我再修改修改。1.2点都提到点子上了。对我有很大的帮助,谢谢了。

回复

使用道具 举报

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

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行