sql - Wrong cardinality on "over partition by" query
问题描述
I have a table with code, send_date, and send_id as pk, on oracle 12.1.0.2
I need to fetch some values for the last code send of each value.
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
Oracle made a cardinality estimation of 1 row due "where n=1" so choose a very bad execution plan on complex querys that use the previous SQL as subquery.
I assume that is a oracle bug https://support.oracle.com/knowledge/Oracle%20Database%20Products/2118138_1.html
There is any workarround to bypass this bug?.
解决方案
这可能是也可能不是错误。更有可能只是基于可用统计数据的优化器失败。
对于您的查询和下面的查询,我建议在(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
)
推荐阅读
- css - 为什么 CSS 规则不应用于嵌入式 SVG 符号?
- microsoft-graph-mail - Microsoft graph API --> To see if the message is a reply
- asp.net - Visual Studio 2017 远程调试器未命中断点
- javascript - React useEffect hook - 带有使用 ID 的 redux 操作的无限循环
- ios - 无法在 AGSMapView 上添加 UI 元素
- amazon-s3 - 在 Java 中从 S3 下载大型 CSV 文件的最佳做法是什么?
- ruby-on-rails - 无法获取 Facebook 应用测试用户的图像
- r - 遍历数据框并根据条件更改值 [R]
- django - 允许经过身份验证和未经身份验证的用户使用令牌身份验证装饰器访问 django 休息视图
- django - 根据与该模型相关的另一个模型的属性搜索模型的记录?