优化 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
在处理大型数据集时表现更差。
那么我们怎样才能实现同样的功能呢? -- 我们可以使用 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
主要是为了性能而创建的。
干杯!!
我该如何优化这个查询, 如何通过存在重写请求:
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
在处理大型数据集时表现更差。
那么我们怎样才能实现同样的功能呢? -- 我们可以使用 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
主要是为了性能而创建的。
干杯!!