複雜 SQL 常為了「單一語句」犧牲效能。將重複查詢邏輯封裝為 PL/SQL 函數,主查詢呼叫函數,可大幅減少連接與掃描開銷。
-- 原始:三表聯結 + GROUP BY SELECT h.empno, e.ename, h.hist_type, t.type_desc, COUNT(*) FROM history_type t, emp e, emp_history h WHERE h.empno = e.empno AND h.hist_type = t.hist_type GROUP BY h.empno, e.ename, h.hist_type, t.type_desc;
CREATE OR REPLACE FUNCTION lookup_hist_type (typ IN NUMBER) RETURN VARCHAR2 AS
tdesc VARCHAR2(30);
CURSOR c1 IS SELECT type_desc FROM history_type WHERE hist_type = typ;
BEGIN
OPEN c1; FETCH c1 INTO tdesc; CLOSE c1;
RETURN NVL(tdesc, '?');
END;
/
CREATE OR REPLACE FUNCTION lookup_emp (empno IN NUMBER) RETURN VARCHAR2 AS
ename VARCHAR2(30);
CURSOR c1 IS SELECT ename FROM emp WHERE empno = empno;
BEGIN
OPEN c1; FETCH c1 INTO ename; CLOSE c1;
RETURN NVL(ename, '?');
END;
/
-- 主查詢簡化為單表掃描 + 函數呼叫
SELECT h.empno, lookup_emp(h.empno),
h.hist_type, lookup_hist_type(h.hist_type),
COUNT(*)
FROM emp_history h
GROUP BY h.empno, h.hist_type;
history_type/emp 主鍵),無連接、無排序。RESULT_CACHE (11g+) 或應用層快取進一步加速。善用 PL/SQL 函數封裝查詢邏輯,是實戰中兼顧 SQL 簡潔與執行效能的利器。