ホームページ >よくある問題 >Oracle には複数のインデックスがありますか?

Oracle には複数のインデックスがありますか?

小老鼠
小老鼠オリジナル
2023-07-06 11:22:561622ブラウズ

Oracle には複数のインデックスがあります。 1. キーに基づいて行または行のセットへの高速アクセスを提供できる「B*」数値インデックス、2. 反復性が高く、通常は読み取り専用のデータに適したビットマップ インデックス、3. 機能-ベース インデックス (関数計算の結果は行の列に格納されます) 4. アプリケーション ドメイン インデックス (自分で構築して保存するインデックス) 5. HASH インデックス (これを使用するには HASH クラスターを使用する必要があります)インデックス; 6. インデックスのパーティション化、インデックスを複数の部分に分割します。

Oracle には複数のインデックスがありますか?

このチュートリアルの動作環境: Windows 10 システム、Oracle バージョン 19c、Dell G3 コンピューター。

Oracle では、使用できるさまざまな種類のインデックスを提供しています。簡単に言えば、Oracle には次のインデックスが含まれています。

1、B* ツリー インデックス

これらは、私が「従来の」インデックスと呼んでいるものです。これは、Oracle およびその他のほとんどのデータベースで最も一般的に使用されるインデックスです。

B* ツリーはバイナリ ツリーのように構築されており、キーに基づいて 1 つの行または一連の行に高速にアクセスできます。通常、正しい行を見つけるには数回の読み取りだけで済みます。ただし、「B*ツリー」の「B」はバイナリを表すのではなく、バランス(平衡)を表すことに注意することが重要です。 B* ツリーを物理的にディスクに保存する方法を紹介するときにわかるように、B* ツリー インデックスはバイナリ ツリーではありません。 B* ツリー索引には次のサブタイプがあります。

索引構成表 (索引構成表): 索引構成表は B* ツリー構造に保管されます。データ行が整理されていない方法で格納されるヒープ テーブルとは異なり (空き領域がある限りデータを配置できます)、IOT 内のデータは主キーの順序で格納および並べ替えられます。アプリケーションにとって、IOT は「通常の」テーブルのように動作します。IOT に正しくアクセスするには SQL が必要です。 IOT は、情報取得、空間システム、OLAP アプリケーションに最も役立ちます。 IoT については、前の章で詳しく説明しました。

B*tree クラスター インデックス (B*tree クラスター インデックス) これらは、従来の B*tree インデックスの変形です (わずかな変更のみ)。 B* ツリー クラスター化インデックスは、クラスター化キーのインデックス付けに使用されるため (第 11 章の「クラスター化テーブルのインデックス付け」セクションを参照)、この章では説明しません。従来の B* ツリーでは、キーは 1 つの行を指しますが、B* ツリー クラスタリングとは異なり、クラスタリング キーは、このクラスタリング キーに関連する複数の行を含むブロックを指します。

降順インデックス: 降順インデックスを使用すると、インデックス構造内でデータを「小さいものから大きいものへ」の順序 (昇順) ではなく、「大きいものから小さいものへ」の順序 (降順) で並べ替えることができます。降順インデックスが重要である理由と、降順インデックスがどのように機能するかを説明します。

リバース キー インデックス: これも B* ツリー インデックスですが、キー内のバイトが「反転」される点が異なります。逆キー インデックスを使用すると、インデックスに値が増加する場合、インデックス エントリをインデックス内でより均等に分散できます。たとえば、シーケンスを使用して主キーを生成する場合、シーケンスは 987500、987501、987502 などの値を生成します。値は連続しているため、従来の B* ツリー インデックスが使用されている場合、これらの値は同じ右側のブロックに配置される可能性があり、このブロックの競合が増加します。 Oracle は逆キーを使用して、205789、105789、005789 などに論理的にインデックスを付けます。 Oracle は、格納されたデータをインデックスに配置する前にバイト反転するため、インデックス内で互いに隣接していた値は、バイト反転後には大きく離れます。バイトを反転すると、インデックスへの挿入が複数のブロックに分散されます。

2. ビットマップ インデックス (ビットマップ インデックス)

B* ツリーでは、通常、インデックス エントリと行の間に 1 対 1 の関係があります。エントリは行を指します。ビットマップ インデックスの場合、1 つのインデックス エントリはビットマップを使用して同時に複数の行を指します。ビットマップ インデックスは、反復性が高く、通常は読み取り専用のデータに適しています (反復性が高いということは、データがテーブル内の総行数に対して個別の値が少数しかないことを意味します)。 100 万行のテーブルを考えてみましょう。各列には、Y、N、NULL の 3 つの値のみが含まれます。たとえば、値 Y を持つ行の数を頻繁にカウントする必要がある場合、これはビットマップ インデックスの構築に適しています。ただし、このテーブルの特定の列に 11,000 個の異なる値がある場合、ビットマップ インデックスを作成できないというわけではありません。もちろん、この列に対してビットマップ インデックスを作成することもできます。 OLTP データベースでは、同時実行関連の問題のため、ビットマップ インデックスは考慮できません (これについては後で説明します)。ビットマップのインデックス作成には Oracle Enterprise または Personal Edition が必要であることに注意してください。

ビットマップ結合インデックス (ビットマップ結合インデックス): これは、(テーブルではなく) インデックス構造内のデータを非正規化する方法を提供します。たとえば、単純な EMP テーブルと DEPT テーブルを考えてみましょう。 「ボストンにある部門で働いている人は何人ですか?」という質問をする人がいるかもしれません。EMP には DEPT を指す外部キーがあります。ボストンの LOC 値を使用して部門の従業員の数を数えるには、通常、この質問に答えるには、EMP レコードへのテーブル結合と LOC 列結合を使用します。ビットマップ結合インデックスを使用すると、EMP テーブルの LOC 列にインデックスを付けることができます。

3. 関数ベースのインデックス (関数ベースのインデックス)

関数の計算結果を行列に格納する B* ツリー インデックスまたはビットマップ インデックスです。列データ自体を保存するのではなく、関数ベースのインデックスは、仮想列 (または派生列) のインデックスと考えることができます。つまり、列はテーブルに物理的に格納されません。関数ベースのインデックスを使用すると、値 FUNCTION(DATABASE_COLUMN) が事前に計算され、インデックスに格納されているため、SELECT * FROM T W HERE FUNCTION(DATABASE_COLUMN) = SAME_VALUE のようなクエリを高速化できます。

4. アプリケーション ドメイン インデックス (アプリケーション ドメイン インデックス)

アプリケーション ドメイン インデックスは、自分で構築して保存するインデックスであり、Oracle またはオラクルの外側。インデックスの選択性と実行のコストをオプティマイザーに伝える必要があります。オプティマイザーは、提供された情報に基づいてインデックスを使用するかどうかを決定します。 Oracle テキスト索引はアプリケーション・ドメイン索引の一例であり、Oracle テキスト索引の作成に使用するのと同じツールを使用して独自の索引を作成することもできます。ここで作成される「インデックス」では、従来のインデックス構造を使用する必要がないことに注意してください。たとえば、Oracle テキスト索引は、一連の表を使用して索引の概念を実装します。

5. HASH インデックス

HASH インデックスを使用するには、HASH クラスターを使用する必要があります。クラスターまたは HASH クラスターを作成するときは、クラスター キーも定義します。このキーは、Oracle にテーブルをクラスターに保存する方法を指示します。データを保存するとき、このクラスター キーに関連するすべての行がデータベース ブロックに保存されます。データが同じデータベース ブロックに格納されており、HASH インデックスが使用されている場合、Oracle は HASH 関数と I/O を実行し、バイナリ高さ 4 の B ツリー インデックスを適用することによってデータにアクセスできます。 4 データ取得時の I/O。

ヒント: HASH インデックスは、制限がある場合 (値の範囲ではなく特定の値を指定する必要がある場合) に非常に便利です。

6. パーティション化インデックス

パーティション化インデックスは、インデックスを複数のフラグメントに分割するだけで、より小さなフラグメントにアクセスでき、これらのフラグメントを個別に保存できるようになります。ハードドライブ (I/O の問題を回避するため)。 B 番号インデックスとビットマップ インデックスはどちらもパーティション化できますが、HASH インデックスはパーティション化できません。

パーティションインデックスには、ローカルパーティションインデックスとグローバルパーティションインデックスの 2 種類があります。各タイプには、プレフィックス付きとプレフィックスなしの 2 つのサブタイプがあります。ビットマップ インデックスを使用する場合、それはローカル インデックスである必要があります。

インデックスをパーティション分割する主な理由は、読み取る必要があるインデックスのサイズを削減することです。さらに、パーティションを異なる表スペースに配置すると、パーティションの可用性と信頼性が向上します。

以上がOracle には複数のインデックスがありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。