助け合いフォーラム

Oracle DB

Oracle Master Silver SQL 2019(1Z0-071)
問題ID : 26828
問題を開く
索引を作成するのに適した列はどれですか(2つ選択して下さい)。

正解

WHERE句の条件や結合条件としてよく使用される列

列にNULL値が多く含まれており、NULL値以外の値を指定して検索する列

解説

次の条件に該当する列に索引を作成すると、検索時のパフォーマンス向上につながります。

・WHERE句の条件や結合条件としてよく使用される列
・列にNULL値が多く含まれており、NULL値以外の値を指定して検索する列
・表の規模が大きく、多くの問合せで15%未満の行を検索する列

以上より、
・WHERE句の条件や結合条件としてよく使用される列
・列にNULL値が多く含まれており、NULL値以外の値を指定して検索する列
が正解となります。

参考

索引はデータの検索を高速化するスキーマ・オブジェクトです。
表の列に索引が設定されると、索引が設定された列の値と、その物理的な格納場所(ROWID)を登録します。
索引が設定されていない表でデータを検索する場合、問合せの条件に従って、表の先頭のデータから1行ずつ検索していきますので、データが大量にある場合には相当の時間がかかります。しかし索引を設定している表では、ROWIDを使用してデータを検索するため、大量のデータの中からでも高速に目的のデータを探すことができます。検索時に索引を使用するかどうかは、SQL問合せの処理を最適化するオプティマイザが判断します。
表に設定された索引は、表に対してDML文を実行する度にメンテナンス(必要であれば更新)されます。

索引の作成はCREATE ANY INDEX権限を持つユーザーによって行われます。
構文は以下のとおりです。

 CREATE [UNIQUE] INDEX 索引名
  ON 表名(列名 [,列名...] [ASC| DESC])
  [VISIBLE | INVISIBLE];

 
 
SQLを表示
CREATE UNIQUE INDEX ind
 ON DEPARTMENTS(department_name);


UNIQUEオプションを指定すると一意索引が作成されます。
一意索引とは、索引に指定した列または列の組合せに重複した値を持つ行がない場合に作成できます。なお、表の作成時、PRIMARY KEY制約やUNIQUE制約を定義した場合には、自動的に一意索引が作成されます。
索引を変更するALTER INDEX文では既存の一意索引を非一意索引に、またはその逆に変更することはできません。索引を再作成する必要があります。


 
SQLを表示
SELECT employee_name, job_id
FROM employees;

CREATE UNIQUE INDEX ind_emp_job
ON employees(job_id);

CREATE UNIQUE INDEX ind_emp_name
ON employees(employee_name);


ON句には複数の列名を指定することもできます(複数の列の組合せで作成した索引を「複合の索引」といいます)。


 
SQLを表示
CREATE INDEX ind_emp
ON employees(employee_name, job_id);


なお、上記のように同じ表に複数の索引(一意索引と非一意索引など)を作成できます。

ASCキーワードは索引を昇順で作成、DESCキーワードは索引を降順で作成するように指定します。デフォルトは昇順です。
降順索引はOracle Databaseにファンクション索引として扱われます。ファンクション索引とは、関数や式を使用した列に作成される索引です。

INVISIBLEキーワードは不可視索引を作成します。不可視索引は、デフォルトではSQL問合せの処理を最適化するオプティマイザから見えないため、問合せ時に使用されない索引です。索引を削除せずに不可視索引に設定することで索引が無い場合のパフォーマンスをテストでき、必要であればデフォルトのVISIBLEに設定し直すことができます。
表に対してDML文を実行する際は、通常の索引のように不可視索引も自動でメンテナンスされます。

表に索引を作成する権限であるINDEXオブジェクト権限かCREATE ANY INDEXシステム権限があれば、別のユーザーが所有する表に対しても索引を作成できます。「スキーマ名.表名」のように表名の前にスキーマ名をつけて、別ユーザーの表を参照します。
※スキーマとは、オブジェクトの所有者を表す論理的な概念です。

 
SQLを表示
CREATE INDEX ind_userA
ON userA.departments(manager_id);

SELECT index_name, table_owner FROM user_indexes
WHERE index_name = 'IND_USERA';


なお、次の条件に該当する列に索引を作成すると、検索時のパフォーマンス向上につながります。

・WHERE句の条件や結合条件としてよく使用される列
・列にNULL値が多く含まれており、NULL値以外の値を指定して検索する列
・表の規模が大きく、多くの問合せで15%未満の行を検索する列

また、以下に該当する列には、逆に索引を作成しないほうが良いとされます。

・WHERE句の条件としてあまり指定されない列
・規模が小さな表の列
・頻繁に更新、追加、削除される列
・式の一部として参照される列
上に戻る

問の解答について

投稿日 2023/01/25

Oracleガイドラインより
大きな表で頻繁に検索される行の割合が15%未満の場合は索引を作成してください。割合は、表スキャンの相対速度、および索引キーに対する行データの分散度によって大きく異なります。表スキャンが高速であるほど割合は低くなり、クラスタ化されている行データが多いほど割合は高くなります。

10%以上でも索引は使用した方が良いのでは無いでしょうか。

スタッフからの返信

s staff_meg

2023/01/26 15:57

Mottchanさん、 ご指摘の点を修正致しました。 ご報告、誠にありがとうございました。

この投稿に対して返信しませんか?