2012-03-05 53 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