使用 row_number 索引提高分区查询的性能

rsi*_*uhe 5 sorting indexing row-number oracle10g

我有一个以下形式的查询:

select a, b, c, d, e, f, g, h,
    row_number () over (partition by a, b order by c, d, e, f) as order
from table;
Run Code Online (Sandbox Code Playgroud)

而且它的性能有点糟糕。

我们尝试创建 2 个索引,第一个用于按列(a 和 b)分区,第二个用于按列(c、d、e、f)排序。

使用解释计划我们发现索引没有被使用。尽管它们对于带有 group by 子句的其他查询很有用。

关于如何重构查询或重新创建索引以帮助提高该查询的性能有什么想法吗?

提前致谢

Ben*_*Ben 1

引用一下我之前的一个回答:

查询不使用索引的两个最常见原因是:

  1. 进行全表扫描速度更快。
  2. 统计数据不佳。

在你的情况下,你从表中选择所有内容,所以我猜测 1. 是主要原因,在这种情况下你就被淘汰了。

您可以尝试使用索引a, b, c, d, e, f,我并不是说收集统计数据没有帮助。如果你还没有,我还是建议你这样做:

begin

   dbms_stats.gather_table_stats (
   ownname => user, 
   tabname => 'MY_TABLE',
   estimate_percent => 25,
   method_opt => 'FOR ALL INDEXED COLUMNS',
   cascade => TRUE );

end;
Run Code Online (Sandbox Code Playgroud)

您的表也极有可能存在大量碎片。如果是这样alter table my_table move,然后收集统计数据。