“over partition by”查询的基数错误
Posted
技术标签:
【中文标题】“over partition by”查询的基数错误【英文标题】:Wrong cardinality on "over partition by" query 【发布时间】:2019-07-09 10:44:59 【问题描述】:我在 oracle 12.1.0.2 上有一个包含代码、send_date 和 send_id 作为 pk 的表
我需要为每个值的最后一次代码发送获取一些值。
select * from (
select code, some_column,
row_number() over (partition by code order by send_date desc, send_id desc) n
from my_table
) where n=1
由于“其中 n=1”,Oracle 对 1 行进行了基数估计,因此对使用先前 SQL 作为子查询的复杂查询选择一个非常糟糕的执行计划。
我认为这是一个 oracle 错误 https://support.oracle.com/knowledge/Oracle%20Database%20Products/2118138_1.html
有什么解决方法可以绕过这个错误吗?
【问题讨论】:
如果您点击“登录”按钮,您链接到的页面可以让您看到一种解决方法和可能的补丁? 【参考方案1】:这可能是也可能不是错误。更有可能只是基于可用统计数据的优化器失败。
对于您的查询和以下查询,我建议在(code, send_date desc, send_id desc, some_column)
上建立索引。
这里有两种编写查询的替代方法,以便您比较性能:
select code,
max(some_column) keep (dense rank first order by send_date desc, send_id desc) as somecolumn
from my_table
group by code;
还有:
select t.code, t.some_column
from my_table t
where (t.send_date, t.send_id) = (select t2.send_date, t2.send_id
from my_table t2
where t2.code = t.code
)
【讨论】:
以上是关于“over partition by”查询的基数错误的主要内容,如果未能解决你的问题,请参考以下文章
HiveSql&SparkSql—COUNT(DISTINCT ) OVER (PARTITION BY )报错解决方案
MariaDB 查询 SUM() OVER (PARTITION BY)
Oracle高级查询之over(partition by..)
Oracle高级查询之over(partition by...)