这里问一个select查询优化的问题,大家一起探讨

[复制链接]
查看11 | 回复6 | 2017-3-27 08:04:23 | 显示全部楼层 |阅读模式
SQL要求
要求:查询TAS用户下在ods_yhs_rkxx表中入库日期(rk_rq)在2009年度纳税人税收金额(rk_je)排行前100名
要求的字段:纳税人编码,名称,注册类型,行业,入库金额,管理机关
可能用到的表dim_hy,dim_djzclx,dim_swjg;
这个是要求
我写的sql如下(要执行很长时间才可以看到结果):
select o.nsrbm as 纳税人编码, d.mc as 名称,zc.djzclx_mc as 注册类型,d.hy_dm as 行业,o.rk_je as 入库金额,swjg.mc as 管理机关
from (select * from ods_yhs_rkxx where to_char(rk_rq,'yyyy')='2009' order by rk_je),ods_yhs_rkxx o
join dim_djzclx zc
on zc.djzclx_dm=o.zclx_dm
join dim_hy d
on d.hy_dm=o.hy_dm
join dim_swjg swjg
on swjg.swjg_dm=o.swjg_dm
where rownumUnnamed2.jpg (93.88 KB, 下载次数: 5)
下载附件
2013-3-18 17:14 上传


Unnamed1.jpg (31.68 KB, 下载次数: 5)
下载附件
2013-3-18 17:13 上传


Unnamed.jpg (83.62 KB, 下载次数: 3)
下载附件
2013-3-18 17:13 上传


回复

使用道具 举报

千问 | 2017-3-27 08:04:23 | 显示全部楼层
Please post execution plan, and Oracle version.
This expression in the where-clause
to_char(rk_rq,'yyyy')='2009'
is almost always bad. Why not change it to rk_rq between to_date('20090101','yyyymmdd') and to_date('20100101','yyyymmdd')? It's likely you have an index on rk_rq. Your expression will ignore the index.
Your last expression
order by rownum asc
makes no sense and is redundant.
回复

使用道具 举报

千问 | 2017-3-27 08:04:23 | 显示全部楼层
select * from ods_yhs_rkxx where to_char(rk_rq,'yyyy')='2009' order by rk_je
对内部子查询,一般没必要排序,如需要系统会自动处理的。
回复

使用道具 举报

千问 | 2017-3-27 08:04:23 | 显示全部楼层
另:
没看到有SUM操作,SQL与你讲的要求不符吧。
回复

使用道具 举报

千问 | 2017-3-27 08:04:23 | 显示全部楼层
> 对内部子查询,一般没必要排序,如需要系统会自动处理的。
But his requirement is that he wants the top 100 rows. Other than this SQL, how do you do it?
回复

使用道具 举报

千问 | 2017-3-27 08:04:23 | 显示全部楼层
本帖最后由 sqysl 于 2013-3-20 15:08 编辑
其实,你这个要求,没必要写那么复杂,而且,你写的SQL,很可能结果不对。
只需加上2009年的条件,再按照税收金额倒序排序,最后取前100条记录就可以,类似:
select* from (
select o.nsrbm as 纳税人编码, d.mc as 名称,zc.djzclx_mc as 注册类型,d.hy_dm as 行业,o.rk_je as 入库金额,swjg.mc as 管理机关
from ods_yhs_rkxxo join dim_djzclx zc on zc.djzclx_dm=o.zclx_dmjoin dim_hy d on d.hy_dm=o.hy_dm join dim_swjg swjg on swjg.swjg_dm=o.swjg_dm
where to_char(rk_rq,'yyyy')='2009'
order by rk_je desc
)
where rownum<=100;


回复

使用道具 举报

千问 | 2017-3-27 08:04:23 | 显示全部楼层
把 选择前100条记录放在 表join之前
select o.nsrbm as 纳税人编码, d.mc as 名称,zc.djzclx_mc as 注册类型,d.hy_dm as 行业,o.rk_je as 入库金额,swjg.mc as 管理机关
from (select *,rownum rnfrom (select * from ods_yhs_rkxx where to_char(rk_rq,'yyyy')='2009' order by rk_je )where rownum<=100 ) o,ods_yhs_rkxx o
join dim_djzclx zc
on zc.djzclx_dm=o.zclx_dm
join dim_hy d
on d.hy_dm=o.hy_dm
join dim_swjg swjg
on swjg.swjg_dm=o.swjg_dm
order by rn asc,
回复

使用道具 举报

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

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行