[英]SQL Query optimization : is scalar subqueries killing the performance?
我需要有關查詢優化的幫助。
下面提到的查詢只是一個示例。 實際查詢有50多個標量子查詢。 基表table_xyz具有超過500萬條記錄。
SELECT
id,
seq,
(
SELECT
function_abc(t.id,t.seq,115501)
FROM
dual
) AS txt_dosage_comments,
(
SELECT
function_abc(t.id,t.seq,115502)
FROM
dual
) AS fld_txt_total_therapy_duration
FROM
table_xyz t;
請檢查當前解釋計划的屏幕截圖
function_abc()
從具有1億條記錄的另一個表中讀取數據。 table1
已在(id, seq, field_id, language)
字段上建立索引。 一對(id,seq)對在行中可能有多個記錄,這就是為什么存在一個循環來連接它們並生成字符串的原因。
這是什么樣的功能:
FUNCTION function_abc (
pi_id int,
pi_seq int,
pi_field_id int
) RETURN CLOB AS
l_result CLOB := NULL;
BEGIN
FOR rec IN (
SELECT
text
FROM
table_1
WHERE
id = pi_id
AND seq = pi_seq
AND language = '001'
AND field_id = pi_field_id
ORDER BY
seq
) LOOP
l_result := concat(l_result,rec.text);
END LOOP;
RETURN l_result;
END;
使用Oracle 12c。
正如所寫,標量子查詢不會降低性能。 函數調用可能是。
您不需要子查詢。 寫吧:
SELECT id, seq,
function_abc(t.id, t.seq, 115501) as txt_dosage_comments,
function_abc(t.id, t.seq, 115502) as fld_txt_total_therapy_duration
. . .
Oracle有一個非常聰明的優化器。 在這種情況下,它將忽略子查詢。
從字段名稱來看,該函數正在表中進行某種查找。 這絕對是大型數據集的性能殺手。
沒有標量的子查詢始終或多或少是一個負擔,通常發生的情況是以后負擔變得無法接受。
一個重要因素是標量函數是否不確定。 當提供相同的參數時,確定性函數將始終返回相同的結果。 通常,任何“選擇”都不能確定,因為數據可能會發生變化。 如果是確定性的,則將延遲限制為提供的值的差異。
總體而言,對於SELECT子查詢,最好嘗試加入,而不要在select子句中使用子查詢。 在大多數情況下,聯接是可行的。
這是我的問題的答案,帶有詳盡的解釋: https : //asktom.oracle.com/pls/asktom/f?p=100 :11:0 ::::: P11_QUESTION_ID: 1594885400346999999596
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.