簡體   English   中英

SQL查詢優化:標量子查詢會降低性能嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM