日期:2014-05-17  浏览次数:20707 次

急求,一条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语句