使用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字典设置为null并尝试从字典字段和SALES中计算其他字段,请尝试将字典连接到SALE。可以从选择(例如NAME,FLAG,...)的任何字段中编写oredering。按查询排序顺序非常快,但订单性能下降。 我建议使用ORACLE MATERIALIZED VIEW但是因为用户经常更新SALES表拒绝这种方法。 您能否支持决定如何通过右外连接和计算字段的顺序来改善此查询的性能。
答案 0 :(得分:0)
我对你的语法感到满意。但我对你的发言感兴趣:
按查询排序很快但排序性能下降
使用ORDER BY子句,数据库必须检索所有行,然后在将结果集返回给您之前对数据进行排序。如果没有ORDER BY,数据库可以在检索到批量数据后立即返回。整个结果集的表现几乎肯定没有变化。
答案 1 :(得分:0)
正如您所说,只有ORDER BY会降低SQL的速度,问题不在于获取数据而是对数据进行排序。因此,即使您有一个带有预先计算数据的物化视图,当每次需要使用不同的字段动态地对数据进行排序时,SQL也需要时间。
更好的方法是 1.与业务/客户讨论,以确定最常用的FEW分拣列。 2.在这些标识的列上创建索引。 (必须很少或者我们最终会得到许多仅对此SQL有用的索引) 3.重写SQL如下。 WITH sorted_result AS(SELECT indexed_columns FROM ORDER BY indexed_Columns)SELECT FROM,sorted_result WHERE AND sorted_result.ID = SALES.ID
在WITH子句中完成排序之前,将避免表访问。外部SQL使用排序结果集来获取批处理/ first_rows_n中的结果。只有访问索引才能进行排序,查询应该更快。
希望这有帮助。