2009-06-30 5 views
5

where条件の値を変更すると、selectクエリで異なるインデックスを使用できますか?同じクエリは異なるインデックスを使用しますか?

2次のクエリは異なるインデックスを使用し、唯一の違いは 条件の値であり、typeenvoi =「EXPORT」またはとtypeenvoiは=「MAIL」

select numenvoi,adrdest,nomdest,etat,nbessais,numappel,description,typeperiode,datedebut,datefin,codeetat,codecontrat,typeenvoi,dateentree,dateemission,typedoc,numdiffusion,nature,commentaire,criselcomp,crisite,criservice,chrono,codelangueetat,piecejointe, sujetmail, textemail 
      from v_envoiautomate 
      where etat=0 and typeenvoi='EXPORT' 
      and nbessais<1 


select numenvoi,adrdest,nomdest,etat,nbessais,numappel,description,typeperiode,datedebut,datefin,codeetat,codecontrat,typeenvoi,dateentree,dateemission,typedoc,numdiffusion,nature,commentaire,criselcomp,crisite,criservice,chrono,codelangueetat,piecejointe, sujetmail, textemail 
      from v_envoiautomate 
      where etat=0 and typeenvoi='MAIL' 
      and nbessais<1 

誰も私に説明を与えることはできますか?

答えて

8

インデックスの詳細は、統計情報としてSQL Serverのヒストグラム型データセットに格納されます。

各インデックスが範囲にチャンク、及び各範囲は、その範囲内のキー値の要約が含まれている、のようなもの:範囲

  • 数の値の

    • 範囲高い値
    • 数高い値に等しい異なる範囲(カーディナリティ)の値の値の
    • 数の

    ...そうです。でどのようにユニークな各値のクエリオプティマイザを伝える各インデックスが選択を密度のような特性のカップルを持って、そして最終的に

    DBCC SHOW_STATISTICS(<tablename>, <indexname>) 
    

    、:

    あなたがして指定されたインデックスに関する統計情報を表示することができますインデックスが存在する可能性が高く、レコードをすばやく見つける上でこのインデックスがどれぐらい効率的であるかを示します。

    クエリにはwhere句に3つの列があるため、これらの列のいずれかに、オプティマイザにとって役立つインデックスがある可能性があります。他のインデックスの選択性が十分に高くない場合、主キーインデックスも考慮される可能性があります。

    最終的に、オプティマイザは、クラスタ化されていないインデックス+ブックマークの参照を、他の値と比較しながら読み取るために必要なページ読み取り数を迅速に判断します。

    これらの判断が基づいている統計は、あまりにも変わることがあります。デフォルトでは、SQL Serverは重要なテーブルの行のわずかな割合しかサンプリングしないため、そのインデックスの選択性は全体を代表するものではない可能性があります。これは、インデックス内に非常にユニークではないキーがある場合に特に問題になります。

    この具体的なケースでは、typeenvoiのインデックスは非常にユニークではないと推測しています。このように、集められた統計は、値の1つが他のものよりも希であることをオプティマイザに示し、そのインデックスが選択される可能性が高くなる可能性があります。

  • 2

    おそらく、 "カーディナリティ"と関係していると思いますが、単語の意味はテーブルの値です。その句に一致する行がさらに多い場合、SQL Serverは、異なる列のインデックスを使用して1つのクエリが効率的になると判断することがあります。これは極端なケースですが、 'MAIL'と一致する行が1つあった場合は、その索引を使用する可能性があります。テーブル内の他のすべての行が 'EXPORT'であったにもかかわらず、その 'EXPORT'行の半分だけがetatで0だった場合、おそらくその列のインデックスが使用されます。

    +1

    @Lazy Bobo:あなたの推論では正しいですが、あなたが探している単語は「選択性」つまりデータ値の分布に基づく列の選択性です –

    4

    SQL Serverのクエリオプティマイザ(最新のDBMSプラットフォーム)は、「コストベースの最適化」という方法論を使用しています。これを行うために、データベース内のテーブルに関する統計を使用して、必要なI/Oの量を見積もります。オプティマイザは、文を解析することによって生成された基本的なクエリプランを変換することによって生成される、意味的に同等の多数のクエリプランを検討します。

    各プランは、テーブルについて管理されている統計に基づくヒューリスティックによってコスト評価されます。統計は、さまざまな種類があります:

    • 表やインデックス行は、個々の列の値の

    • 分布のヒストグラムをカウントします。分布ヒストグラムの「EXPORT」対「メール」のocurrenceが大幅に異なる場合

    は、クエリオプティマイザは異なる最適な計画を思い付くことができます。これはおそらく起こったことです。

    関連する問題