Oracle でテーブルを操作する場合、適切なインデックスと不適切なインデックスを設定していることをどのように判断しますか?
6 に答える
これは、「良い」と「悪い」の意味によって異なります。基本的に、追加するすべてのインデックスがその列による検索のパフォーマンスを向上させることを認識する必要があります (そのため、person テーブルの 'lastname' 列にインデックスを追加すると、"where lastname = " を含むクエリのパフォーマンスが向上します)。テーブル全体で書き込みパフォーマンスが低下します。
この理由は、行を追加または更新するときに、テーブル自体と行がメンバーであるすべてのインデックスの両方を追加または更新する必要があるためです。したがって、テーブルに 5 つのインデックスがある場合、追加ごとに 6 つの場所 (5 つのインデックスとテーブル) に書き込む必要があり、最悪の場合、更新によって最大 6 つの場所にアクセスする可能性があります。
インデックスの作成は、クエリ速度と書き込み速度のバランスをとる行為です。場合によっては、夜間のジョブで週に 1 回だけデータをロードするが、毎日何千回もクエリを実行するデータマートなどの場合、インデックスをオーバーロードして、クエリを可能な限り高速化することが非常に理にかなっています。ただし、オンライン トランザクション処理システムの場合は、それらの間でバランスをとろうとする必要があります。
つまり、選択クエリで頻繁に使用される列にインデックスを追加しますが、追加しすぎないようにして、最も使用される列を最初に追加します。
その後、本番環境でパフォーマンスがどのように反応するかを確認するために負荷テストを行い、許容可能なバランスを見つけるために多くの調整を行います。
多様で、非常に具体的で、またはユニークなフィールドは、適切なインデックスになります。日付とタイムスタンプ、一意の増分番号 (主キーとして一般的に使用される)、個人名、ナンバー プレート番号など...
反例は性別です。一般的な値は 2 つしかないため、インデックスはスキャンする必要がある行数を減らすのに実際には役立ちません。
クエリを実行する人が文字列の正確な値を知ることはめったにないため、完全な長さの説明的な自由形式の文字列はインデックスとしては不十分です。
線形に並べられたデータ (タイムスタンプや日付など) は、クラスター化されたインデックスとして一般的に使用されます。これにより、行が強制的にインデックス順に格納され、順序どおりのアクセスが可能になり、範囲クエリが大幅に高速化されます (たとえば、「販売注文をすべてください」 10 月から 12 月まで」)。このような場合、DB エンジンは範囲で指定された最初のレコードをシークし、最後のレコードに到達するまで順次読み取りを開始できます。
@Infamous Cow-インデックスではなく、主キーについて考えている必要があります。
@Xenph Yan-他の人が触れていないことは、作成するインデックスの種類を選択することです。一部のデータベースでは実際には多くの選択肢がありませんが、さまざまな可能なインデックスがあるデータベースもあります。Bツリーはデフォルトですが、常に最良の種類のインデックスであるとは限りません。適切な構造の選択は、予想される使用法の種類によって異なります。どのような種類のクエリを最もサポートする必要がありますか?ほとんど読み取りまたは書き込み-ほとんどの環境にいますか?あなたの書き込みは更新または追加によって支配されていますか?等
さまざまなタイプのインデックスとその長所と短所の説明は、http://20bits.com/2008/05/13/interview-questions-database-indexes/で入手できます。
SQL Server に関する優れた記事は次のとおりです: http://www.sql-server-performance.com/tips/optimizing_indexes_general_p1.aspx
メカニズムは Oracle では機能しませんが、ヒントは非常に適切です (Oracle ではまったく同じように機能しないクラスター化インデックスに関することを除いて)。
特定のクエリを改善しようとしている場合のいくつかの経験則。
特定のテーブル (Oracle が開始する必要があると思われる場所) について、WHERE 句で使用される各列のインデックスを作成してみてください。最初に等しい列を配置し、その後に範囲などの列を配置します。
例えば:
WHERE CompanyCode = ? AND Amount BETWEEN 100 AND 200
列のサイズが非常に大きい場合 (たとえば、XML などを保存している場合)、それらをインデックスから除外した方がよい場合があります。とにかく選択リストを満たすためにテーブル行に移動する必要があると仮定すると、これによりスキャンするインデックスが小さくなります。
あるいは、SELECT 句と WHERE 句のすべての値がインデックスにある場合、Oracle はテーブルの行にアクセスする必要はありません。そのため、選択した値をインデックスの最後に配置し、テーブルへのアクセスをまとめて回避することをお勧めする場合があります。
索引付けの最良の方法についての本を書くことができます。著者のジョナサン・ルイスを探してください。
適切なインデックスとは、特定のテーブル行に対して一意であると信頼できるものです。
一般的に使用されるインデックス スキームの 1 つは、テーブルの行ごとに 1 ずつ増加する数値を使用することです。すべての行は、異なる数値インデックスを持つことになります。