4

我有一个表格查询:

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;

而且它的性能有点糟糕。

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

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

关于如何重构查询或重新创建索引以帮助提高此查询的性能的任何想法?

提前致谢

4

1 回答 1

1

引用我之前的回答:

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

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

在您的情况下,您正在从表中选择所有内容,所以我猜 1. 是主要原因,在这种情况下您会被冲洗掉。

你可以试试 index 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;

您的表也有很大的碎片化的可能性很小。如果是这样alter table my_table move,然后收集统计数据。

于 2012-03-05T20:41:02.373 回答