【问题标题】:Query optimisation / rewriting查询优化/重写
【发布时间】:2021-11-24 15:14:08
【问题描述】:

我需要重写以下查询以进行优化,但我遇到了一些麻烦

SELECT w.wname, SUM(w.price) sold_total, FROM wine w GROUP BY w.wname;

SELECT * from class WHERE CID = 'RIES ' OR CID = 'CHARDN' OR CID = 'PINOT';

我想我需要为第一个对象创建一些对象,为第二个对象创建一个绑定变量,但我不确定。也不确定最佳语法。

希望得到一些帮助

【问题讨论】:

  • 在第二个查询中,请从将 * 替换为您真正需要的列开始
  • 第一个不是有效的 SQL 语句。 sold_total 后面多了一个逗号。我不确定这里作业的目标是什么。你真的想重写查询吗?因为第一个查询似乎是表达查询的一种完全合理的方式。还是优化查询?在这种情况下,我们需要从您要优化什么开始(例如,减少逻辑读取的作业是什么?)以及查询计划是什么?
  • 是的,重点是编写它们并使用知识来优化它们
  • 有没有办法在查询之外计算 sum 或 w.price 然后调用它?

标签: sql oracle performance


【解决方案1】:

您的第一个查询:

SELECT w.wname, SUM(w.price) sold_total FROM wine w GROUP BY w.wname

无法真正优化,因为它使用了SUM() 函数和聚合,最终必须涉及表中的每条记录。由于这里没有过滤,因此使用索引没有太大优势,Oracle 可能会决定进行全表扫描。对于第二个查询:

SELECT * from class WHERE CID = 'RIES ' OR CID = 'CHARDN' OR CID = 'PINOT';

您可以考虑添加以下索引:

CREATE INDEX idx_class ON class (CID);

这将涵盖WHERE 子句,这是过滤步骤,让查询执行得更快。

【讨论】:

  • 它可能不会对优化器最终提出的结果产生影响,而只是一个更易于维护的替代 'WHERE CID = 'RIES' OR CID = 'CHARDN' OR CID = 'PINOT ' 将是 WHERE CID IN ('RIES', CHARDN', 'PINOT')
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-27
  • 2015-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多