Oracle

以Procedure的形式優化SQL查詢

  • February 15, 2018

我有一個帶有多個“IN”語句的 Oracle SQL 查詢。平均執行大約需要一分鐘。

我的任務是以 PL/SQL 過程的形式優化此查詢,以便使用者將輸出結果集作為參考游標。

請建議。謝謝!

SQL查詢:

select sp.column1, sp.column2,sp.column3,gen.column1,nvl(gen.column2,0)+nvl(gen.column3,0) GENSIZE,gen.column4,gen.column5 
from table1 sp,
(select * from table2 where table2.column1 in (
select table1.column4 from table1 where table1.column2 in (
select table3.column1 from table3 where table3.column2='124578'))) gen
where gen.id=sp.id;

至於返回 ref 游標,以下應該可以工作;

CREATE OR REPLACE PROCEDURE get_table1_data(p_column2 IN table3.column2%TYPE, 
                                           p_tables_recs  OUT SYS_REFCURSOR ) AS
BEGIN

  OPEN p_table_recs FOR 
     SELECT sp.column1
          , sp.column2
          , sp.column3
          , gen.column1
          , NVL(gen.column2, 0) + NVL(gen.column3, 0) gensize
          , gen.column4
          , gen.column5
     FROM   table1 sp
         , (SELECT *
            FROM   table2
            WHERE  table2.column1 IN (SELECT table1.column4
                                      FROM   table1
                                      WHERE  table1.column2 IN (SELECT table3.column1
                                                                FROM   table3
                                                                WHERE  table3.column2 = p_column_2))) gen
      WHERE  gen.id = sp.id;
END get_table1_data;      

您的查詢將變成一個簡單的INNER JOIN鏈,如下所示:

請注意:我使用的是 gen 別名,____因為我不知道您要從哪個表中獲取值。

____因此,您可以使用正確的別名表更改每一個。

SELECT t1.column1, t1.column2, t1.column3, ____.column1,
      nvl(____.column2,0) + nvl(____.column3,0) GENSIZE,
      ____.column4, ____.column5 
FROM table1 t1
JOIN table2 t2
   ON t1.column4 = t2.column1
JOIN table3 t3
   ON t3.column1 = t1.column2
WHERE t3.column2 = '1234578'
AND t1.id = ___.id

引用自:https://dba.stackexchange.com/questions/197977