2011-06-15 56 views
0

by子句創建一個帶有順序函數索引我需要通過索引表上在Oracle

Student (
    roll_No, 
    name, 
    stream, 
    percentage, 
    class_rank, 
    overall_rank ) 

我想查詢像

SELECT * 
    FROM student 
WHERE stream = 'science' 

預期的結果將是創建一個訂單學生按排名降序排列。一個要求是我無法在查詢本身中指定按子句的順序。

這應該通過索引on(stream,order by class_rank desc)來實現。這在oracle中可以實現嗎?

+6

保證結果集順序的唯一方法是使用ORDER BY子句;在可能的情況下,索引用於加速數據檢索。 – 2011-06-15 05:27:21

+1

所以這似乎是由不知道他們在說什麼的導師設置的家庭作業練習。祝你好運! – 2011-06-15 12:25:14

回答

4

如果不指定ORDER BY子句,Oracle不保證返回行的順序。這個要求沒有意義。

您可能會很幸運,並發現Oracle選擇了一個恰好以您想要的順序返回行的查詢計劃。但是這將是一個幸運的問題 - Oracle可能明天選擇不同的查詢計劃,或者Oracle版本升級可能會導致更改結果。例如,當新版本的Oracle添加了一種更有效的分組算法,但沒有排序結果的副作用時,多年來依賴GROUP BY子句排序結果作爲副作用的人們感到不安。

0

我得到它的工作

CREATE INDEX stream_rank_idx ON Student (stream,class_rank desc); 

所以當過我火了SELECT * FROM學生,在流=?查詢上面的索引將被使用,它會返回我想要的結果。

我認爲它幾乎總是安全的,如果我不升級甲骨文。甚至在升級之後,oracle會改變索引選取的方式的概率非常低。

+2

或直到您以Oracle決定執行全表掃描而不是使用索引的方式使用該表。這看起來像是一種以非常不可靠的方式做事的做法。 – eaolson 2011-06-16 04:04:21