协助将Oracle SQL查询重写为长时间不停止执行的查询

问题描述 投票:0回答:1

我需要帮助来重写下面的 Oracle SQL 查询,因为该查询会长时间执行而不会停止。我尝试使用联接重写查询,但结果不是我想要的。谢谢你。

SELECT ADDRESS_ID,
   ADDRESS,
   NETWORKCONVERAGE,
   ADDRESSBUILDINGTYPE,
   ADDRESSBUILDINGNAME,
   ADDRESSPOSTCODE,
   FTP_NAME,
   ORDER_ID_NEW,
   ORDER_STATUS,
   INSTALLATION_DATE
   
FROM (
    SELECT ADDRESSPOSTCODE || '_' || ADDRESSHOUSENUMBER || '_' || ADDRESSFLOORNUMBER || '_' || ADDRESSUNITNUMBER ADDRESS_ID,
           ADDRESSHOUSENUMBER || ' ' || ADDRESSSTREETNAME || ' #' || ADDRESSFLOORNUMBER || '-' || ADDRESSUNITNUMBER || ' Singapore ' || ADDRESSPOSTCODE ADDRESS,
           NETWORKCONVERAGE,
           ADDRESSBUILDINGTYPE,
           ADDRESSBUILDINGNAME,
           ADDRESSPOSTCODE,
           SUBSTR(FTPPORT, 1, INSTR(FTPPORT, '/', 1) - 1) FTP_NAME,
           ORDER_ID_NEW,
           FORM_STATUS ORDER_STATUS,
           TO_DATE(INSTALLATIONDATE, 'YYYYMMDD') INSTALLATION_DATE
    FROM ARADMIN4.ON_ADVANCEDINTERFACE_PORTALRES
    WHERE SUBSTR(ORDER_ID_NEW, 4, 2) = '01'
    AND SCHEDULE = '01'
)
WHERE ADDRESS_ID NOT IN (
                        SELECT (ADDRESSPOSTCODE || '_' || ADDRESSHOUSENUMBER || '_' || ADDRESSFLOORNUMBER || '_' || ADDRESSUNITNUMBER)
                        FROM ARADMIN4.ON_ADVANCEDINTERFACE_PORTALRES
                        WHERE SUBSTR(ORDER_ID_NEW, 4, 2) = '01'
                        AND SCHEDULE = '01'
                        AND FORM_STATUS = 'Completed'
                    );

我尝试使用 join 重写查询,但结果不是我想要的。

1 ADDRESS_ID 可能有几个 ORDER_ID 具有不同的 ORDER_STATUS(已完成、已拒绝等)。我想获取没有 ORDER_ID 且 ORDER_STATUS = 'Completed' 的 ADDRESS_ID。

例如,01_01_01 的 ORDER_ID_1 状态 = 已完成,ORDER_ID_2 状态 = 拒绝,02_02_02 的 ORDER_ID_1 状态 = 拒绝,ORDER_ID_2 状态 = 待处理,那么当我运行 SQL 查询时,它应该只返回 02_02_02。

oracle oracle-sqldeveloper
1个回答
0
投票

使用以下提示运行查询

SELECT /*+ GATHER_PLAN_STATISTICS * ADDRESS_ID,
   ADDRESS,
   NETWORKCONVERAGE,
   ADDRESSBUILDINGTYPE,
   ADDRESSBUILDINGNAME,
   ADDRESSPOSTCODE,
   FTP_NAME,
   ORDER_ID_NEW,
   ORDER_STATUS,
   ...
   ...

然后运行

select * from table(dbms_xplan.display_cursor(null,null,'ALLSTATS LAST +COST'))

这将评估优化器估计值与每个执行阶段的实际数字有何不同。

这是调整 SQL 语句的绝佳第一步

© www.soinside.com 2019 - 2024. All rights reserved.