【发布时间】:2016-04-22 20:16:22
【问题描述】:
使用Oracle数据库 有 SALES 表和很多字典表 DICT_1、DICT_2、... DIC_N。 用户可以更改 SALES 表(插入更新删除)并询问结果数据,例如:
SELECT
S.ID as ID,
RPAD(D1.NAME, 10) || LPAD(D1.NAME, 10) as NAME,
CASE
WHEN D2.count > 0 THEN 'Y'
ELSE 'N'
END
as FLAG
D3.FIELD as SOME_FIELD_3
D4.FIELD as SOME_FIELD_4
D5.FIELD as SOME_FIELD_5
FROM SALES S, DICT_1 D1, DICT_2 D2, DICT_3 D3, DICT_4 D4, DICT_5 D5
WHERE
S.D1_ID = D1.ID(+)
AND S.D2_ID = D2.ID(+)
AND S.D3_ID = D3.ID(+)
AND S.D4_ID = D4.ID(+)
AND S.D5_ID = D5.ID(+)
ORDER BY NAME;
因此,如果没有 sutch 字典设置为空,请尝试将字典加入 SALE,并从字典字段和 SALES 中计算附加字段。排序可以应用到选择中的任何字段(例如 NAME、FLAG、...)。没有按查询排序非常快,但排序性能下降。 我建议使用 ORACLE MATERIALIZED VIEW 但因为用户经常更新 SALES 表而拒绝这种方法。 您能否支持决定如何通过右外连接和按计算字段排序来提高此查询的性能。
【问题讨论】:
-
这是某种古老的右连接语法吗?
-
首先,切换到现代的显式连接语法。此外,大多数人在使用 LEFT JOIN 时遇到了很多问题,并且发现 RIGHT JOIN 更加令人困惑。所以,帮大家一个忙,切换到 LEFT JOIN!
-
不幸的是语法不能影响性能
标签: sql oracle performance