我需要有关查询优化的帮助。
下面提到的查询只是一个示例。实际查询有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。
答案 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)