2012-03-05 23 views
2

指数ROW_NUMBER表现我对形式的查询:提高超过分区查询

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子句的查询。

关于如何重构查询或重新创建索引的任何想法,以便它们帮助查询性能?

在此先感谢

+2

请发布查询计划。 – 2012-03-06 03:58:38

+0

列是否不为空? – 2012-03-06 05:58:15

回答

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; 

还有一个远程可能性,你的表是大规模分割。如果是的话012 然后收集统计数据。

+1

即使对'a,b,c,d,e,f'有一个索引,它也可能不会使用它 - 一个完全覆盖的索引(去除随机表访问)over a,b,c,d,e ,可能会使用f,g,h'。但是,索引的大小会使原始表格变矮,并且仍然可能不会被使用:) – 2012-03-06 03:57:50

+0

我想补充一点,重建表格的过程有点过早 - 我首先看一下查询计划以确定为什么Oracle首先决定不使用索引。 – 2012-03-06 03:58:32

+0

查看查询,它按原样返回每一行 - 没有过滤。 – 2012-03-06 06:18:40