使用许多RIGHT OUTER JOIN和ORDERING提高SQL查询的性能



使用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 dictionary设置null,请尝试将dictionary连接到SALE,并从dictionary字段和SALES中计算额外的字段。可以对select中的任何字段(例如NAME、FLAG…)进行排序。按查询排序很快,但排序性能会下降。我建议使用ORACLE MATERIALIZED VIEW,但因为用户经常更新SALES表,所以拒绝了这种方法。请您决定如何通过计算字段的右外联接和顺序来提高此查询的性能。

我对你的语法很满意。但我对你的声明感兴趣:

通过查询取消订单是相当快的,但随着订单性能下降

使用ORDERBY子句,数据库必须检索所有行,然后在将结果集返回给您之前对数据进行排序。如果没有ORDERBY,数据库可以在检索到一批数据后立即返回这些数据。几乎可以肯定,整个结果集的性能没有变化。

正如您所说,只有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。由于只访问索引进行排序,因此查询应该更快。

希望这能有所帮助。

最新更新