“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...)

Oracle高级查询之over(partition by...)

Oracle高级查询之over(partition by...)