优化选择不同的查询

时间:2019-09-30 06:03:05

标签: sql oracle distinct

如何优化此查询, 如何通过存在来重写请求:

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;

2 个答案:

答案 0 :(得分:1)

请首先使用ANSI样式的联接语法。

现在,根据我的知识NVL,关于您的问题,在处理大型数据集时表现较差。

那么我们如何实现相同的功能? -我们可以使用DECODECASE 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);

请确保正确创建PKsFKs,并且由于创建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;

我在左/右方向可能错了,因为我对(+)的使用并不频繁。

希望这会有所帮助。