如何优化此查询, 如何通过存在来重写请求:
select DISTINCT
p.SBJ_ID,
nvl(l.ATTR,c.CODE) as ATTR,
l.VALUE
from T_TRFPRMLST p,
T_CMSATTR_LINK l,
C_SBJCONCEPT c
where l.SBJ_ID(+) = p.SBJ_ID
and p.sbj_id = c.ID;
答案 0 :(得分:1)
请首先使用ANSI
样式的联接语法。
现在,根据我的知识NVL
,关于您的问题,在处理大型数据集时表现较差。
那么我们如何实现相同的功能? -我们可以使用DECODE
或CASE WHEN
。
在这两个方面中,CASE WHEN
在性能方面会更好。
比较问题中提到的查询的执行计划和以下查询的执行计划,您肯定会发现不同之处。
SELECT DISTINCT
P.SBJ_ID,
CASE
WHEN L.ATTR IS NOT NULL THEN L.ATTR
ELSE C.CODE
END AS ATTR,
L.VALUE
FROM
T_TRFPRMLST P
JOIN C_SBJCONCEPT C ON ( P.SBJ_ID = C.ID )
LEFT JOIN T_CMSATTR_LINK L ON ( P.SBJ_ID = L.SBJ_ID);
请确保正确创建PKs
和FKs
,并且由于创建indexes
主要是为了提高性能,因此正确的indexes
也可用。
干杯!
答案 1 :(得分:0)
此处不能使用exists
,因为您在select
中使用了多个表列。
而且我知道您在连接表格时应该使用标准的join
关键字。
select DISTINCT
p.SBJ_ID,
nvl(l.ATTR,c.CODE) as ATTR,
l.VALUE
from T_TRFPRMLST p
join T_CMSATTR_LINK l
on l.SBJ_ID = p.SBJ_ID
join C_SBJCONCEPT c
on p.sbj_id = c.ID;
我在左/右方向可能错了,因为我对(+)的使用并不频繁。
希望这会有所帮助。