我在下面的查询中遇到问题,因为下面的查询使用了对选定列表中的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;
答案 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