我有一个大约需要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;
如何重写它以提高性能?
答案 0 :(得分:1)
因此,您有一个至少包含三列的表VAR1_TABLE
,VAR1
,D_TYPE
和VAR1_NAME
...您选择的行数为{{1} }另一个表中的列,然后您与VAR1
上的VAR1_TABLE
一起加入,然后再次加入MEM_VAR1 = VAR1
?你可以解释一下这部分,因为这对我没有意义......你为什么要比较D_TYPE = VAR1_NAME
和D_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