2013-10-25 14 views
6

私はテーブルオラクル:シングル、マルチカラムインデックスまたは2つの列インデックス

create table1(
    column1 number(10, 
    column2 number(10), 
    column3 number(10) 
); 

column1が主キー column2column3が、私は2列

にユニーク制約を作成した外部キ​​ー

である必要があり

alter table table1 
     add constraint table1_contr1 unique(column1,column2) 
     using index tablespace tbs1; 

インデックスを作成するとき両方の列に

create index table1_idx1 on table1(column1,coulmn2); 

ERROR at line 1: 
ORA-01408: such column list already indexed 

したがって、私は一意制約を作成するときにすでに索引を作成しています。私は別にそれがそれらの

create index table1_idx1 on table1(column1); 
create index table2_idx2 on table2(column2); 

を受け付けてインデックスを作成した場合でも、今、私の質問は、両方の列に一意制約をした後、私はまだ、各列にインデックスを作成する心配する必要はありますか?オブジェクトにアクセスする際に、各列のインデックスがないとパフォーマンスに影響はありますか?

これはoracle 11R2です。

+1

'column2'と' column3'が外部キーであると言うとき、 'column2、column3'のコンビネーションはコンポジットプライマリキーを持つ単一の親テーブルの外部キーですか?あるいは、 'column2'と' column3'は親テーブルを単一カラムの主キーで区切るための外部キーですか? 'column1'がすでに主キーであれば、なぜあなたは' column1'と 'column2'の組み合わせに対してユニーク制約を作成していますか? 'column1'はすでにユニークなので、それと他のものの組み合わせは一意になります。 'col2、col3'に一意の制約を作成しているということですか? –

+0

申し訳ありませんが、誤植です。私は(col2、col3)に一意制約を作成しています。 – user2824874

答えて

9

それが依存...

それはあなたがすでにcolumn1, column2に複合インデックスを持っている場合だけcolumn1のインデックスが有益になることは非常に考えにくいです。 column1が主要な索引であるため、述語としてcolumn1のみを持つ表に対する照会では、複合索引を使用できます。索引のフルスキャンを実行する必要がある問合せを頻繁に実行していて、column2が存在すると索引のサイズが大幅に増加する場合は、完全索引スキャンではI/Oを少なくします。しかし、それはかなり珍しい状況です。

インデックスがcolumn2の場合、テーブルに対するクエリの一部が述語を指定している場合に便利です。明示的に値がcolumn1の場合は、コンポジット索引を使用して索引スキップ・スキャンを実行し、述語としてcolumn2のみを指定する問合せを満たすことができます。しかし、スキップスキャンは範囲スキャンよりも効率が低いので、ちょうどcolumn2のインデックスがこれらのクエリに有益である可能性があります。 column1に多数の異なる値がある場合、スキップスキャンはさらに効率が悪く、ちょうどcolumn2のインデックスがより有益です。もちろん、column2を使用してテーブルを照会することもなく、述語をcolumn1に指定しない場合は、ただちにcolumn2にインデックスを追加する必要はありません。

0

索引は、索引のキーを探してそのキーにリンクされた値を戻すため、SELECT句を使用するたびに情報の検索時のパフォーマンスを向上させる構造です。しかし、索引は情報の検索を効率的に保つために構造を更新する必要があるため、更新および挿入操作のコストを増加させます。

単一列の索引を作成しても読取りパフォーマンスは向上しませんが、書込みおよび更新のパフォーマンスAFAIKは低下します。

関連する問題