【TRY! ORACLE MASTER】11g SQL基礎I 編
(第6回 表以外のオブジェクト)

みなさん、こんにちは。TRY! ORACLE MASTER シリーズ第6回です。今回は、ビュー、順序、索引、シノニムといった、表以外のオブジェクトについて見ていきます。


まずは、順序に関する問題です。

問題(11)

次の文を実行しました。

CREATE SEQUENCE line_item_id_seq
START WITH 10001
MAXVALUE 999999999
NOCYCLE;

このCREATE SEQUENCE文に関して正しい記述はどれですか。

  1. この順序は最大値に達した後も値を生成し続ける。
  2. この順序は番号を再利用せず、増分を1とする。
  3. INCREMENT BYの値を指定していないので、構文エラーとなる。
  4. この順序は番号を再利用し、開始番号は10001である。


回答と解説:

 正解は、2.です。

番号を自動で生成したいときに使用する順序というオブジェクト。作成時にオプションを指定することで、生成される順序番号をカスタマイズできます。その作成時のオプションについて確認する問題でした。

START WITHは順序の開始値を、MAXVALUEは最大値を指定します。NOCYCLEは、最大値まで達した後、番号を再利用しない、という意味です。
INCREMENT BYというオプションで増分を指定できますが、この例では指定していませんね。その場合は、増分1となります。



どうでしたか?あまり馴染みのないオブジェクトかも知れませんが、うまく使うと効果的なオブジェクトです。ぜひ覚えておきましょう。
次は索引についてです。

問題(12)

一般的に、どのような列に索引を作成するとよいでしょうか。

  1. 行数が少ない表。
  2. 含まれる値の種類が多く、WHERE句の条件で少ない行数に絞り込まれる列。
  3. 含まれる値の種類が少なく、WHERE句の条件であまり絞り込まれない列。
  4. WHERE句の条件でnull値のデータを検索する列。


回答と解説:

 正解は、2.です。

検索速度に問題があると、索引を付けようか、という話になりますが、無闇に付けたその索引、実は使われていないかも?!一般論として、どんな列に索引をつけるべきか、という問題でした。

結論から言うと、WHERE句の条件によって、沢山の行から、ごくごく一部の行に絞り込むようなケースで、索引は効果を発揮します。

もともと行数の少ない表では、索引スキャンよりも全表スキャンの方が高速となるケースが多いです。含まれる値の種類が多く、WHERE句の条件に よって少ない行に絞り込まれる場合、まさに索引が効果を発揮するケースです。WHERE句の条件でnull値のデータを検索する場合は、索引は役に立ちま せん。nullのデータは索引に格納されないからです。

実際に索引を使うかどうか、決めているのは"オプティマイザ"です。索引を使った方が効果的な場合は索引を使い、そうでない場合は索引を使いません。



いかがでしたでしょうか。SQL編は今回でおしまいです。不正解だったかたは各トピックを見直してくださいね。次回は、Bronze DBA編に入って、「Oracle Databaseのインストールと管理」です。お楽しみに!