Oracle
以Procedure的形式優化SQL查詢
我有一個帶有多個“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