重写SQL查询以优化性能

时间:2016-09-08 07:01:53

标签: sql oracle

我有一个大约需要2秒才能加载的查询:

SELECT OUTPUT_VAL.NEXTVAL VAR1_R_ID,A.R_ID,A.VAR1,A.SEQU,A.OUTPUT,B.VAR1 DATATYPE_VAR1 
FROM
( 
    SELECT A.R_ID,A.VAR1,A.SEQU,A.OUTPUT,B.D_TYPE
    FROM
    (
        select A.R_ID, 2484 VAR1,1 SEQU, A.USER OUTPUT 
        from R_TB_1 A 
        WHERE A.R_ID BETWEEN 2457854437 AND 2458854437
        union all
        select A.R_ID, A.MEM_VAR1 VAR1,1 SEQU, MEM_OUTPUT OUTPUT 
        from R_TB_1 A 
        WHERE A.R_ID BETWEEN 2457854437 AND 2458854437
    ) A 
    LEFT JOIN VAR1_TABLE B 
        ON A.VAR1=B.VAR1
) A 
LEFT JOIN VAR1_TABLE B 
    ON A.D_TYPE=B.VAR1_NAME;

如何重写它以提高性能?

2 个答案:

答案 0 :(得分:1)

因此,您有一个至少包含三列的表VAR1_TABLEVAR1D_TYPEVAR1_NAME ...您选择的行数为{{1} }另一个表中的列,然后您与VAR1上的VAR1_TABLE一起加入,然后再次加入MEM_VAR1 = VAR1?你可以解释一下这部分,因为这对我没有意义......你为什么要比较D_TYPE = VAR1_NAMED_TYPE?仅仅因为你可以做到并且查询运行没有错误并不意味着它有意义。

假设表R_TB_1有很多行(您似乎选择了100,000行,这是整个表的一小部分),VAR1_NAME表示该表被扫描两次。你可能最好只选择一次,在CTE中,然后根据CTE进行联合......如果你的版本至少是Oracle 11.1。 (顺便说一下,无论何时提出问题,请说明您的Oracle版本!)如果您使用的是Oracle 10或更低版本,则需要像现在这样的子查询。

这样的事情:

UNION ALL

答案 1 :(得分:-3)

WITH temp AS (
SELECT OUTPUT_VAL.NEXTVAL VAR1_R_ID,A.R_ID,A.VAR1,A.SEQU,A.OUTPUT,B.VAR1 DATATYPE_VAR1 FROM

( 
SELECT A.R_ID,A.VAR1,A.SEQU,A.OUTPUT,B.D_TYPE FROM
(
SELECT A.R_ID, 2484 VAR1,1 SEQU, A.USER OUTPUT from R_TB_1 A WHERE A.R_ID BETWEEN 2457854437 AND 2458854437

union ALL

select A.R_ID, A.MEM_VAR1 VAR1,1 SEQU, MEM_OUTPUT OUTPUT from R_TB_1 A WHERE A.R_ID BETWEEN 2457854437 AND 2458854437
)
A LEFT JOIN VAR1_TABLE B ON A.VAR1=B.VAR1 ) 
A LEFT JOIN VAR1_TABLE B ON A.D_TYPE=B.VAR1_NAME
)
SELECT * FROM temp