【问题标题】:Improve performance in SQL query with many RIGHT OUTER JOIN and ORDERING使用许多 RIGHT OUTER JOIN 和 ORDERING 提高 SQL 查询的性能
【发布时间】: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


【解决方案1】:

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

不按查询排序速度很快,但排序性能下降

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

【讨论】:

    【解决方案2】:

    正如您所说,只有 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 的形式为您获取结果。只访问索引进行排序,查询应该更快。

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-21
      • 2013-04-15
      • 1970-01-01
      • 1970-01-01
      • 2021-11-03
      • 2013-03-10
      • 2018-01-15
      相关资源
      最近更新 更多