SQL查询优化:标量子查询会降低性能吗?

时间:2018-07-21 11:33:50

标签: sql oracle performance query-optimization

我需要有关查询优化的帮助。

下面提到的查询只是一个示例。实际查询有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;

请检查当前说明计划的屏幕截图

please check the screenshot of current explain plan

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。

3 个答案:

答案 0 :(得分:0)

按书面说明,标量子查询不会降低性能。函数调用可能是

您不需要子查询。只需写:

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有一个非常聪明的优化器。在这种情况下,它将忽略子查询。

从字段名称来看,该函数正在表中进行某种查找。绝对是大型数据集的性能杀手。

答案 1 :(得分:0)

没有标量的子查询始终或多或少是一个负担,通常发生的情况是以后负担变得无法接受。

一个重要因素是标量函数是否不确定。当提供相同的参数时,确定性函数将始终返回相同的结果。通常,任何“选择”都不能确定,因为数据可能会发生变化。如果是确定性的,则延迟将限于提供的值的差异。

对于整个SELECT子查询,最好尝试加入,而不要在select子句中使用子查询。在大多数情况下,联接是可行的。

答案 2 :(得分:0)

以下是我的问题的答案,并有详尽的解释: https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:1594885400346999596

相关问题