2009-05-14 1 views
9

誰かがインデックスが悪いインデックスであることを教えてもらえますか?(DBMS内の)インデックスが不良インデックスとなるのはいつですか?

+6

あなたの質問(およびそのタイトル)を再作成することができます。たぶんあなたは "SQLテーブルの不良インデックス" - "インデックスを悪いインデックスとして定義して置き換えるには何のパラメータを取るべきですか?" –

+5

ある時にインデックスがありました。しかし、これは普通の指数ではありませんでした。それは正常に見えましたが、それは悪い指数でした。誰も気付かれなければ、それは完全な混乱の中で葉のノードにぶら下がっている葉のノードと不均衡になった。リーフノードが多すぎるばかりでなく、悪い統計情報の集まりも出ていました。そしていつか、DBCCと呼ばれる妖精が来て、「なぜあなたは悪い指数ですか?他のすべての指数と同じように良い指数にならないのですか?彼女は彼女の魔法杖と再索引を振った。その後、悪い統計情報がなくなるように統計を更新しました。インデックスは妖精に言った "... – KristoferA

+0

おかげで素晴らしい説明 – Anoop

答えて

1

フィールドが使用されていない場合、それは悪いインデックスです(不必要なことが悪いと感じる場合)。

+0

どうもありがとうございます。作成されたインデックスは使用されていません – Anoop

+0

例:Other_Commentsというフィールドがあります。誰もフィールドにデータを入力していない人はいませんフィールドをクエリしたことはありません。 – JeffO

11

索引付けされた列が検索されず、表が大幅に更新されている場合、索引が対象とするパフォーマンスの利点はありません。逆に、パフォーマンスが低下する可能性があります。

+0

ありがとうございました – Anoop

1

インデックスは、より高速に行を検索するのに役立ちます。

インデックス列がで、検索に使用されていない場合は、と定義する必要はありません。

は非常に頻繁にを変え続けるその列の値は、それが(インデックスの再作成のための)データベース・サーバのための余分な作業になる場合

あまりにも多くのインサートがあり、テーブルからを削除した場合サーバの余分な仕事になる

+0

インデックスが列のセットに含まれている可能性があることを忘れないでください。 –

+0

ありがとうございます。しかし、どのようにインデックス付きの列はできません頻繁に使用 – Anoop

+1

@ジョハサンは事実のためにありがとう @テーブルから行を選択するためのjoinまたはwhere句で索引付けされた列を使用していない場合は、venkatはあまり使用されません。 – TheVillageIdiot

11

同じ列を使用する別のインデックスがある場合は、インデックスがかなり無条件に悪い状況がある(と同じ接頭辞として順):

CREATE INDEX ix_good ON SomeTable(Col1, Col2, Col3); 
CREATE INDEX ix_bad ON SomeTable(Col1, Col2); 

悪いインデックスは、ディスクスペースの無駄ですし、無利益のために業務を変更する速度が遅くなります。

+1

+1ですが、「同じ順序」の部分を強調します。 :) – KristoferA

+0

ありがとうございました – Anoop

1

)。あなたは通常、速いスキャンの利点を得るためにそのヒットを望んでいます。利益を得られないときは純損失であり、それは悪い指数です。

考えられる理由:

  • インデックス
  • 冗長インデックス
  • 非常に頻繁にスキャンしたが、テーブルがあるので、インデックスを持つのヒットが利益をoutgrows(継続的に更新されていないテーブルを使用したことがありませんほとんどスキャンされません)。
  • 頻繁にスキャンされ、連続的に更新されるテーブル。この場合、挿入/更新のためのインデックスのないテーブルと、毎日または毎時のバッチで更新されるインデックスのテーブルを持つことによって、インデックスとスニッピーな更新/挿入の両方の利点を得ることができますこのような場合に重大なパフォーマンス上の問題が発生した場合は、ハードウェアを改善したり、アプリケーションを再設計する必要があります。

どのように悪いインデックスを見つけるには?ほとんどのRDBMSには、クエリプランを表示するオプションがあります。そこには、設定したインデックスが期待どおりに使用されているかどうかが表示されます。これは最終的なアドバイスにつながり、あなたのインデックスについて考えてください。決して「正しい」ものを作成することはありません。

1

索引は検索しないと悪いです。たとえば、インデックス(Col1、Col2、Col3)は、同じクエリでCol1、Col2、およびCol3を使用して検索しないと、リソースの無駄です。

4

インデックス(前述の「実際の使用」の部分を除いて)に留意する重要なことは、選択性の概念です。

インデックスを作成するときは、「高い選択性」の可能性が高い列にインデックスを作成する必要があります。これには、列内のデータを理解する必要があります(ドメインの知識/サンプルデータの可用性に応じて、またはそうでないかもしれません)。

選択性=個別値の#/行

の合計#は、そのような列にインデックスを作成するテーブルGIVEN_NAME、姓の列と「人」、性別、たとえば年齢

を、使用できるようにしますジェンダー(性別がNULL、MまたはFに制限されている)がクエリ中に大きな利益をもたらさない(特にクエリが既に他の理由でテーブルスキャンを実行している場合)。いずれのシナリオにおいても、この指標の選択性は極めて低い。 DBMSによっては、このインデックスを使用すると実際にはテーブル全体のスキャンが悪化する可能性があります。

ただし、(Given_name、Surname)にコンポジットインデックスを作成すると、これらの列に対してクエリを実行するときにメリットが得られます。このインデックスの選択性(ほとんどの人口)はかなり良いでしょう。

1の選択性を持つ索引が理想ですが、選択度1を達成する唯一の方法は、null不可能な列に一意の索引を付けることです。

また、インデックスとその選択性を「把握する」ためのクエリを簡単に作成できることに注意してください。

関連する問題