选择列表中的函数调用导致ORDER BY子句出现性能问题

时间:2018-08-29 18:13:09

标签: sql oracle

我在下面的查询中遇到问题,因为下面的查询使用了对选定列表中的PKG.GET_PHONE_NUMBER的调用来获取电话详细信息,并且通过使用ORDER BY,大约需要2分钟才能完成 16k行。没有ORDER BY很快。

query下面将获得PK key列的说明,并通过以下参数获取电话详细信息以调用该函数以获取主要,辅助和传真号码。

    SELECT distinct PK_column , 
           description , 
           PKG.GET_PHONE_NUMBER (pk_column,'PRI') primary_phone_no ,
           PKG.GET_PHONE_NUMBER (pk_column,'SCD') sec_phone_no , 
           PKG.GET_PHONE_NUMBER (pk_column,'FAX') fax_phone_no
    FROM table_name
    ORDER BY pk_column

在不创建任何临时表的情况下,对调优查询的任何帮助会受到赞赏吗?


此函数在下面GET_PHONE_NUMBER:

SELECT P.PHONE_AREA_CODE || P.PHONE_NUMBER INTO V_PHONE_NUMBER 
FROM PHONE P WHERE UPPER(P.PK_column) = UPPER(PK_column) 
 AND P.PHONE_NUMBER_TYPE = IN_PHONE_NO_TYP; 

2 个答案:

答案 0 :(得分:2)

  
    

没有快速订购。

  

您的意思是,没有ORDER BY,您将立即获得结果。但是要获得 all 结果需要多长时间?可能不是很快。

如果没有ORDER BY,Oracle可以在获得结果时立即开始为您提供结果。但是,使用ORDER BY,Oracle需要在内部获取所有结果,以便对其进行排序。只有这样,它才能开始返回结果。

这种差异使许多初学者感到困惑,认为一个查询比另一个查询更快。如果您只真正需要前几个结果,则没有ORDER BY的查询只会“更快”。如果您需要所有结果,那么它们的速度可能大致相同。

关于调优思想,我不能不讲PKG.GET_PHONE_NUMBER内部的逻辑。

答案 1 :(得分:1)

下面是最终查询,当主查询与krokodilko建议的函数查询结合使用时,可以提高性能:

SELECT   CC.pk_column   pk_column,
         CC.DESCRIPTION   DESCRIPTION,
         PRI.PHONE_AREA_CODE || PRI.PHONE_NUMBER  PRIMARY_PHONE_NUMBER,
         SCD.PHONE_AREA_CODE || SCD.PHONE_NUMBER  SECONDARY_PHONE_NUMBER,
         FAX.PHONE_AREA_CODE || FAX.PHONE_NUMBER  SECONDARY_PHONE_NUMBER
         FROM table_name CC
         LEFT JOIN PHONE PRI
       ON  UPPER(PRI.pk_column)  = UPPER(CC.pk_column)                                       
         AND PRI.PHONE_NUMBER_TYPE   ='PRI'
           LEFT JOIN PHONE SCD
       ON  UPPER(SCD.pk_column)  = UPPER(CC.pk_column)                                       
         AND SCD.PHONE_NUMBER_TYPE   ='SCD'
         LEFT JOIN PHONE FAX
       ON  UPPER(FAX.pk_column)  = UPPER(CC.pk_column)                                       
         AND FAX.PHONE_NUMBER_TYPE   ='FAX'
         ORDER BY pk_column