[Oracle]优化一个查询包含一个最大子查询

Posted

技术标签:

【中文标题】[Oracle]优化一个查询包含一个最大子查询【英文标题】:[Oracle]Optimization a query contain a max subquery 【发布时间】:2016-01-05 07:44:13 【问题描述】:

我想知道是否有办法根据该请求优化视图:

SELECT product ,
  price ,
  quantity_in_stock ,
  location
FROM mytableA x
WHERE x.price =
  (SELECT MAX( z.price )
  FROM mytableA z
  WHERE (z.quantity_in_stock > 0)
  AND z.product          = x.product
  ); 

谢谢。

【问题讨论】:

【参考方案1】:

使用分析函数(单表扫描)而不是相关子查询(两表扫描):

SELECT product,
       price,
       quantity_in_stock,
       location
FROM   (
  SELECT product,
         price,
         quantity_in_stock,
         location,
         MAX( CASE WHEN quantity_in_stock > 0 THEN price END ) OVER ( PARTITION BY product ) AS max_price_in_stock
  FROM   MyTable
)
WHERE price = max_price_in_stock;

【讨论】:

嗨@Mt0,不幸的是,它增加了成本。之前是 15 595,然后是 21 780。

以上是关于[Oracle]优化一个查询包含一个最大子查询的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 基础教程-09 常见查询示例

Oracle 查询优化器是不是将*** where 子句应用于子查询或视图?

Oracle中的伪列

Oracle 优化——奇怪的执行计划左加入一个不相关的子查询

Oracle子查询相关内容(包含TOP-N查询和分页查询)

子查询