web-dev-qa-db-ja.com

データベースのテーブル列にインデックスを作成するタイミングを決定しますか?

私はdb男ではありません。しかし、テーブルを作成し、それらに対してCRUD操作を行う必要があります。デフォルトですべての列にインデックスを作成する必要があるかどうか、混乱しますか?これが、インデックスの作成中に検討する私の理解です。

インデックスには、基本的にメモリロケーションの範囲が含まれます(最初の値が保存される開始メモリロケーションから最後の値が保存される終了メモリロケーション)。したがって、列のテーブルインデックスに値を挿入するときは、もう1つの値を取得しているので更新する必要がありますが、列の値の更新はインデックス値に影響しません。 右?つまり、2つのテーブル間の結合で列を使用する場合、結合で使用する列にインデックスを作成することを検討する必要がありますが、他のすべての列はスキップできます。列に新しい値が挿入されたときにインデックス値を更新するための追加コスト。右?

テーブルmytableに2つの3つの列、つまりcol1col2col3が含まれるこのシナリオを検討してください。このクエリを実行します

select col1,col2 from mytable

現在、2つのケースがあります。最初のケースでは、col1col2にインデックスを作成します。 2番目のケースでは、インデックスを作成しません。**私の理解では、ケース1はケース2よりも高速です。ケース1では、Oracleが列メモリの場所をすばやく見つけることができるためです。したがって、ここでは結合列を使用していませんが、それでもインデックスが役立ちます。ここでインデックスを作成することを検討すべきですか?**

上記と同じシナリオで発砲した場合

select * from mytable

の代わりに

select col1,col2 from mytable

ここでインデックスが役立ちますか?

30
M Sach

ただし、列値の更新はインデックス値に影響しません。右?

いいえ。インデックス付きの列を更新すると影響があります。 Oracle 11g パフォーマンスマニュアル は次のように述べています。

インデックス付きの列を変更するUPDATEステートメントと、インデックス付きのテーブルを変更するINSERTおよびDELETEステートメントは、インデックスがない場合よりも時間がかかります。このようなSQLステートメントは、インデックス内のデータとテーブル内のデータを変更する必要があります。また、追加の取り消しとやり直しも作成します。


つまり、2つのテーブル間の結合で列を使用する場合、結合で使用する列にインデックスを作成することを検討する必要がありますが、他のすべての列はスキップできます。列に挿入されます。右?

挿入だけでなく、他のデータ操作言語ステートメント。

このシナリオを検討してください。 。 。ここでインデックスは役立ちますか?

この最後の段落に関して、インデックスを作成する列に関する仮定を証明または反証できるように、代表的なデータボリュームを使用していくつかのテストケースを作成してみませんか?

15
Ian Carpenter

すべての列にインデックスを作成しないでください!挿入/削除/更新操作の速度が低下します。

簡単なリマインダーとして、WHEREORDER BY、およびGROUP BY句で共通の列にインデックスを作成できます。他のテーブルを関連付けるために使用される列にインデックスを追加することを検討できます(たとえば、JOINを使用)

例:

SELECT col1,col2,col3 FROM my_table WHERE col2=1

ここで、col2にインデックスを作成すると、このクエリに非常に役立ちます。

また、インデックスの選択性も考慮してください。簡単に言えば、「大きなドメイン」、つまりID、名前などを持つ値のインデックスを作成します。男性/女性の列には作成しないでください。

30
santiagobasulto

特定のシナリオでは、WHERE句がないため、テーブルスキャンが使用されるか、インデックススキャンが使用されますが、ドロップする列は1つだけなので、パフォーマンスはそれほど変わらない可能性があります。 2番目のシナリオでは、インデックスはカバーされておらず、WHERE句がないため、インデックスは使用しないでください。 WHERE句がある場合、インデックスを使用すると、フィルタリングにより、欠落している列を取得するために検索する必要がある行の数を減らすことができます。

Oracleには、ヒープまたは索引構成表を含む多数の異なる表があります。

インデックスがカバーしている場合は、特に選択的な場合に使用される可能性が高くなります。ただし、WHERE句に制約があり、ベーステーブルよりもカバーインデックスの列がはるかに少ない場合、インデックス構成テーブルはヒープのカバーインデックスよりも優れていることに注意してください。

実際に使用される列よりも多くの列を持つインデックスを作成するのは、インデックスをカバーする可能性が高い場合にのみ役立ちますが、すべての列を追加することは、インデックス編成テーブルに似ています。 Oracleには、インデックスをよりカバーするために使用できるSQL ServerのINCLUDE(COLUMN)に相当するものがないことに注意してください(列のサブセットのみの追加クラスタ化インデックスを効果的に作成します-インデックスを一意にしたい場合に便利ですが、また、一意性を考慮したくないデータを追加しますが、より多くのクエリをカバーするのに役立ちます)

計画を見て、インデックスが物事に役立つかどうかを判断する必要があります。その後、計画を見て、それらが違いを生むかどうかを確認します。

3
Cade Roux