繁体   English   中英

重写SQL查询以优化性能

[英]Rewrite SQL query to optimize performance

我有一个查询,大约需要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;

如何重写它以提高性能?

所以,你有一个表VAR1_TABLE至少有三列, VAR1D_TYPEVAR1_NAME ...你选择有行VAR1从另一个表列,那么你加入VAR1_TABLEMEM_VAR1 = VAR1 ,然后你再加入D_TYPE = VAR1_NAME 您能解释一下这部分吗,因为这对我来说毫无意义...为什么将D_TYPEVAR1_NAME进行比较? 仅仅因为您可以做到并且查询运行没有错误并不意味着就可以了。

假设表R_TB_1有很多行(您似乎选择了100,000行,这是整个表的一小部分),那么UNION ALL表示该表被扫描了两次。 如果您的版本至少是Oracle 11.1,则最好只在CTE中选择一次,然后再基于CTE进行合并...。 (顺便说一句,每当您提出问题时,请声明您的Oracle版本!)如果您使用的是Oracle 10或更低版本,则将需要像现在一样的子查询。

像这样:

with 
     Z ( R_ID, MEM_VAR1, USER, MEM_OUTPUT ) as (
       select R_ID, MEM_VAR1, USER, MEM_OUTPUT
       from   R_TB_1
       where  R_ID between 2457854437 and 2458854437
     ),
     A ( R_ID, VAR1, SEQU, OUTPUT ) as (
       select R_ID, 2484    , 1, USER
         from Z
       union all
       select R_ID, MEM_VAR1, 1, MEM_OUTPUT
         from Z 
     )
select  -- your joins from A to the other table here; A is defined in the WITH clause
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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM