適切なインデックスが何であるかをどうやって知ることができますか?

StackOverflow https://stackoverflow.com/questions/79241

  •  09-06-2019
  •  | 
  •  

質問

Oracle でテーブルを操作する場合、適切なインデックスを設定しているのか、不適切なインデックスを設定しているのかをどのように判断すればよいでしょうか?

役に立ちましたか?

解決

これは、「良い」と「悪い」が何を意味するかによって異なります。基本的に、インデックスを追加するたびに、その列による検索のパフォーマンスが向上することを認識する必要があります (つまり、person テーブルの「lastname」列にインデックスを追加すると、「where lastname = 」を含むクエリのパフォーマンスが向上します)。テーブル全体の書き込みパフォーマンスが低下します。

その理由は、行を追加または更新する場合、テーブル自体と、その行がメンバーであるすべてのインデックスの両方を追加または更新する必要があるためです。したがって、テーブルに 5 つのインデックスがある場合、各追加は 5 つのインデックスとテーブルの 6 か所に書き込む必要があり、最悪の場合、更新は最大 6 か所に影響する可能性があります。

インデックスの作成は、クエリ速度と書き込み速度のバランスをとる作業です。夜間のジョブで週に 1 回しかデータがロードされないが、毎日何千回もクエリが実行されるデータマートなど、場合によっては、インデックスをオーバーロードしてクエリを可能な限り高速化することが非常に合理的です。ただし、オンライン トランザクション処理システムの場合は、それらの間のバランスを見つける必要があります。

つまり、選択クエリで頻繁に使用される列にインデックスを追加しますが、追加しすぎないようにし、最もよく使用される列を最初に追加します。

その後は負荷テストを行って本番環境でパフォーマンスがどのように反応するかを確認し、許容可能なバランスを見つけるために多くの調整を行います。

他のヒント

多様なフィールド、高度に特殊なフィールド、またはユニークなフィールドは、優れたインデックスとなります。日付とタイムスタンプ、一意の増分番号 (主キーとしてよく使用される)、個人の名前、ナンバー プレート番号など...

反例は性別です。共通の値は 2 つしかないため、インデックスはスキャンする必要がある行数を減らすのに実際には役立ちません。

完全長の記述的な自由形式の文字列は、クエリを実行する人が文字列の正確な値をほとんど知らないため、インデックスとしては不十分です。

線形に順序付けされたデータ (タイムスタンプや日付など) は一般にクラスター化インデックスとして使用されます。これにより、行がインデックス順に格納され、順序どおりのアクセスが可能になり、範囲クエリ (例:「10 月から 12 月までの販売注文をすべてください」)。このような場合、DB エンジンは範囲で指定された最初のレコードを単純にシークし、最後のレコードに到達するまで順次読み取りを開始できます。

SQL Server に関する優れた記事は次のとおりです。http://www.sql-server-performance.com/tips/optimizing_indexes_general_p1.aspx

この仕組みは Oracle では機能しませんが、ヒントは非常に適切です (Oracle ではまったく同じように機能しないクラスター化インデックスに関するものを除きます)。

@Inious Cow -- インデックスではなく主キーについて考えている必要があります。

@xenph yan-他の人が触れていないことは何を選ぶか 親切 作成するインデックスの。データベースによっては、あまり選択肢がありませんが、さまざまなインデックスを使用できるものもあります。B ツリーは、 デフォルト ただし、常に最良の種類のインデックスであるとは限りません。適切な構造の選択は、予想される使用法の種類によって異なります。最もサポートする必要があるクエリは何ですか?読み取りがほとんどの環境、または書き込みがほとんどの環境にいますか?書き込みは更新または追加によって占められていますか?などなど

さまざまな種類のインデックスとその長所と短所の説明は、次のとおりです。 http://20bits.com/2008/05/13/interview-questions-database-indexes/ .

特定のクエリを改善しようとする場合の経験則。

特定のテーブル (Oracle を開始する必要があると考えられるテーブル) について、WHERE 句で使用される各列のインデックスを作成してみてください。等号を含む列を最初に配置し、その後に範囲などを含む列を配置します。

例えば:

WHERE CompanyCode = ? AND Amount BETWEEN 100 AND 200

列のサイズが非常に大きい場合 (例:XML か何かを保存している場合)、それらをインデックスから除外したほうがよいかもしれません。これにより、とにかく選択リストを満たすためにテーブル行に移動する必要があると想定して、スキャンするインデックスが小さくなります。

また、SELECT 句と WHERE 句のすべての値がインデックス内にある場合、Oracle はテーブル行にアクセスする必要はありません。したがって、選択した値をインデックスの最後に置き、テーブルへの一括アクセスを避けることが良い場合もあります。

インデックスを作成する最良の方法についての本を書くこともできます。著者のジョナサン ルイスを探してください。

優れたインデックスとは、テーブルの特定の行が一意であることが信頼できるものです。

一般的に使用されるインデックス スキームの 1 つは、テーブル内の行ごとに 1 ずつ増加する数値を使用することです。すべての行は最終的に異なる数値インデックスを持つことになります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top