急求,一条sql语句的优化
SQL code
select zzny.facility_id,
zzny.u_name,
zzny.nf year,
zzny.yd month,
nvl(hgl.lckhgl, 0)*100 lckhgl
from (select facility_id, u_name, year, month, yxts, total, bhgs, lckhgl
from ZZ_LIMS_Y_LCKHGL) hgl,
(select zz.facility_id, zz.u_name, ny.nf, ny.yd
from base_facility_tb zz,
(select distinct nf, yd from gygl_zzcbpwl_view) ny) zzny
where hgl.facility_id(+) = zzny.facility_id
and hgl.year(+) = zzny.nf
and hgl.month(+) = zzny.yd
from 后面的两个查询第一个有1680条,第二个有112条记录,当然两个查询的数量还会增加。这两个查询的速度还算可以,但是联合之后的查询速度根本不能忍受,请问各位朋友有没有什么方法可以优化一下。谢谢了!
------解决方案--------------------
看一下执行计划才行。
------解决方案--------------------zz和ny笛卡儿积?
另外,gygl_zzcbpwl_view是view?查查其SQL,是否合理。
------解决方案--------------------select zz.facility_id, zz.u_name, ny.nf, ny.yd
from base_facility_tb zz,
(select distinct nf, yd from gygl_zzcbpwl_view) ny
你这个语句做笛卡尔积了,???
------解决方案--------------------这数据结构设计的有问题。另外,建立索引也无法避免全表扫描,因为你内嵌视图里根本没有where过滤。
从数据量来看,数据也根本不多。
再次建议,如果gygl_zzcbpwl_view是视图,应该考虑优化它先。特别是避免类似万能视图一样的东西。
------解决方案--------------------不理解楼主的业务逻辑,所以希望可以把表关系贴出来。
上面主要问题出现在hgl和zzny遍历次数太多了,如果可以在这两条sql里面把数据过滤到最低,那会对性能有提升的。
提升性能,首先是硬件达到标准,然后是表分区索引等,在就是sql语句