2011-06-15 12 views
0

にorder by句と機能インデックスを作成する私はオラクル

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

は私が期待される結果は次のようになり

SELECT * 
    FROM student 
WHERE stream = 'science' 

のようなものを照会したいテーブル上のインデックスで順序を作成する必要があります彼らの階級の降順で配置された学生。クエリ自体にorder by句を指定することはできません。

これはインデックス(stream、class_rank descによる順序)によって達成される必要があります。これはオラクルで達成可能ですか?

+6

結果セットの順序を保証する唯一の方法は、ORDER BY句です。索引は、可能であれば、データ検索を高速化するためのものです。 –

+1

これは、彼らが何を話しているのか分からない家庭教師が設定した宿題です。それと幸運! –

答えて

4

ORDER BY句を指定しない場合、Oracleは行の返される順序を保証しません。要件は意味をなさない。

幸運にも、Oracleは必要な順序で行を返すクエリプランを選択することがあります。しかし、それは運の問題だろう - 明日は別のクエリプランを選択するか、Oracleバージョンのアップグレードによって変更する結果が出るかもしれない。たとえば、新しいバージョンのOracleが結果の順序付けの副作用を持たないより効率的なグループ化アルゴリズムを追加したときに、副作用として結果を順序付けするGROUP BY句で長年信頼されていた人々は苦労しました。

0

今まで私が学生ストリームSELECT * FROMを発射するとき、私はそれが=そう

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

を働いてしまいましたか?クエリは、上記のインデックスが使用され、それは私に希望の結果を返します。

と私はそれがほとんど常に安全だと思います。もし私がオラクルをアップグレードしていなければ。アップグレード後でさえ、oracleが索引の選択方法を変更する可能性は非常に低いです。

+2

または、索引を使用するのではなく、Oracleが全表スキャンを実行する方法でその表を使用するまでは、これはちょうど非常に信頼性のない方法で何かをするための工夫された方法のように思えます。 – eaolson