优化 select 不同的查询

optimization select distinct query

我该如何优化这个查询, 如何通过存在重写请求:

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;

您不能在此处使用 exists,因为您在 select 中使用了超过 1 table 列。 我知道你在加入 tables 时应该使用标准 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;

我在 left/right 中可能是错误的,因为我不常使用 (+)。

希望对您有所帮助。

请首先使用 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 主要是为了性能而创建的。

干杯!!