32

インデックスにはどのような種類があり、それぞれの利点は何ですか?

カバリング インデックスとクラスター化インデックスについて聞いたことがありますが、他にもありますか? それらをどこで使用しますか?

4

11 に答える 11

31
  • 一意 - インデックスに含まれる列 (または列のセット) の一意の値を保証します
  • カバー - 特定のクエリ (または一連のクエリ) で使用されるすべての列が含まれているため、データベースはインデックスのみを使用でき、結果を取得するために実際にテーブル データを参照する必要はありません。
  • クラスター化 - これは、実際のデータがディスク上で順序付けられる方法です。つまり、クエリでクラスター化インデックスを使用して値を検索する場合、データの実際のテーブル行を検索する追加の手順を実行する必要はありません。指数には含まれていません。
于 2008-09-25T20:23:52.957 に答える
7

OdeToCodeには、基本的な違いをカバーする優れた記事があります

それが記事で言うように:

大規模なデータベースで優れたパフォーマンスを発揮するには、適切なインデックスが不可欠です。時々、あなたは良いインデックスで不十分に書かれたクエリを補うことができますが、最高のクエリでさえ貧弱なインデックスを補うのは難しいかもしれません。

まったく真実です...もしあなたがそれを始めたばかりなら、私はクラスター化インデックスと複合インデックスに焦点を合わせます。おそらくそれらがあなたが最も使用するものになるからです。

于 2008-09-25T20:13:50.830 に答える
6

いくつかのインデックスタイプを追加します

BITMAP-可能な値の数が非常に少なく、非常に高速で、多くのスペースを占有しない場合

PARTITIONED-ストレージまたはパフォーマンス上の理由から、非常に大きなデータベースオブジェクトで通常有利ないくつかのプロパティに基づいてインデックスをパーティション化できます。

FUNCTION / EXPRESSIONインデックス-テーブルに基づいて値を事前に計算し、それをインデックスに格納するために使用されます。非常に単純な例として、lower()またはサブストリング関数に基づくインデックスがあります。

于 2008-09-25T20:16:14.943 に答える
5

PostgreSQL では、述語に一致する行のみがインデックス化される部分インデックスを使用できます。たとえば、アクティブなレコードのみの顧客テーブルにインデックスを付けたい場合があります。これは次のようになります。

create index i on customers (id, name, whatever) where is_active is true;

インデックスに多くの列があり、多くの非アクティブな顧客がいる場合、これはスペース (インデックスがより少ないディスク ページに格納される) とパフォーマンスの点で大きな利点となります。必要なインデックスにヒットするには、少なくとも次の述語を指定する必要があります。

select name from customers where is_active is true;
于 2008-09-25T21:29:18.667 に答える
3

従来の通念では、インデックスの選択はカーディナリティに基づくべきであることが示唆されています。彼らは言うでしょう、

GENDER のようなカーディナリティの低い列には、ビットマップを使用します。LAST_NAME のようにカーディナリティが高い場合は、b-tree を使用します。

これは Oracleには当てはまりません。代わりに、アプリケーションのタイプ (OLTP と OLAP) に基づいてインデックスを選択する必要があります。ビットマップ インデックスを含むテーブルの DML は、重大なロック競合を引き起こす可能性があります。一方、Oracle CBO は複数のビットマップ インデックスを簡単に組み合わせることができ、ビットマップ インデックスを使用して null を検索できます。原則として:

頻繁な DML とルーチン クエリを使用するOLTPシステムの場合は、btree を使用します。DML およびアドホック クエリの頻度が低いOLAPシステムの場合は、ビットマップを使用します。

これが他のデータベースに当てはまるかどうかはわかりませんが、コメントを歓迎します。次の記事では、この件についてさらに説明します。

于 2008-09-26T23:14:26.617 に答える
2

Jason Massie( http://statisticsio.com/)とBrent Ozar(http://www.brentozar.com/)のブログで関連情報を検索することをお勧めします。彼らは、インデックスを扱う実際のシナリオについていくつかの投稿をしています。

于 2008-09-25T20:27:21.967 に答える
2

データベース システムが異なれば、同じタイプのインデックスに対しても異なる名前が付けられるため、これには注意してください。たとえば、SQL Server と Sybase が「クラスター化インデックス」と呼んでいるものは、Oracle では「インデックス編成テーブル」と呼ばれます。

于 2008-09-25T20:26:18.723 に答える
2

Oracle には、B ツリー、ビットマップ、パーティション化および非パーティション化、リバース バイト、ビットマップ結合、およびドメイン インデックスのさまざまな組み合わせがあります。

この件に関する 11gR1 ドキュメントへのリンクは次のとおりです

于 2008-09-25T21:36:32.457 に答える
1
  1. 個性的
  2. 集まる
  3. 非クラスタ
  4. 列ストア
  5. 列を含む索引
  6. 計算列のインデックス
  7. フィルタリングされた
  8. 空間的な
  9. xml
  10. 全文
于 2015-02-22T17:54:45.803 に答える
0

インデックスの種類とその意味を確認するには、 https ://msdn.microsoft.com/en-us/library/ms175049.aspx にアクセスしてください。

于 2016-09-14T11:57:07.143 に答える
0

SQL Server 2008 には、PostgreSQL の部分インデックスと同様に、フィルター処理されたインデックスがあります。どちらも、指定された条件に一致する行のみをインデックスに含めることができます。

構文は PostgreSQL と同じです。

create index i on Customers(name) where is_alive = cast(1 as bit);
于 2008-09-26T22:19:53.440 に答える