2017-12-09 3 views
-1

索引を作成する最良の方法は次のうちどれですか?oracleの索引:

私のクエリは次のとおりです。原則としてcreate index emp_index on employees_table (emp_name,emp_last_name,salary);

select emp_name,emp_last_name, salary 
from employees_table 
where salary <=2000; 

1. create index emp_index on employees_table (salary); 

2. create index emp_index on employees_table (emp_name,emp_last_name,salary); 
+1

をカウントし、インデックスがあなたの意見や理由に優れている、あなたの意見は、何ですか? – krokodilko

+0

私の意見では、インデックスがsalaryカラムでのみ作成された場合、sqlengineはsalaryフィールドにのみアクセスできますが、他のデータにアクセスするにはテーブルを検索する必要があるためです。 –

+0

良い答えです。これらの2つのイデックスから、2番は1番よりも優れています。このようなインデックスは、[カバーインデックス](http://use-the-index-luke.com/sql/clustering/index-only-scan-covering-index)として知られています。しかし、この具体的なクエリのためのより良いオプション(3)があります。 - > 'employees_table(salary、emp_name、emp_last_name);でインデックスemp_indexを作成します。 #2と同じですが、列の順序だけが違うことに注意してください...なぜそれが良いのか分かりますか? – krokodilko

答えて

1

クエリのOracleはインデックスのみではなく、任意のテーブルのデータを読み込む必要があるため、1良いだろう。

しかし、これは確かに過剰キーである特定のクエリごとに個別のインデックスを作成することを意味します。

0

の場合2つのインデックスOracleの場合は、インデックスの最初の列に不本意な値が多い場合は、Oracleが多くのテーブルアクセスを選択することがあります、インデックスの最初の列に別個の値がない場合、インデックススキップスキャン。あなたが表示されます最初のインデックス「索引レンジ・スキャン」+「行IDによってテーブル・アクセス」については

....

しかしため、両方のインデックスの - SQLのリターンは> 5から7パーセントの行がOracleは多分使用したい場合「フル・テーブル・アクセス」...

すべてが表に自分のデータに依存して、戻り行

関連する問題