4

次の列を含む巨大な (数百万行) テーブルがあります。

[When] datetime2(0),
[What] tinyint,
[Who] bigint

これは基本的に、さまざまなエンティティ (「誰」) に一度に (「いつ」) 発生したイベント (「何」) の表です。「What」には約 10 の異なる値があります。これは列挙型です。現時点で「Who」には約 10,000 の値があります。

このテーブルにクエリを実行して、特定の時間の間に 1 つ以上のエンティティに何かが発生したかどうかを確認できるようにしたいと考えています。たとえば、[When = '2012-10-01' から '2012-11-01'] の間に [Who = 0, 1, 2, 3] に [What = 0, 1, 2, 3] が発生しましたか。

このテーブルにインデックスを付ける最善の方法についてアドバイスを求めています。複合インデックスが最適だと確信していますが、正確な構成はわかりません。たとえば、列の順序はどうあるべきですか? 「最も選択的な」列は左側に移動する必要があると読みましたが、この場合は [いつ]、[誰が]、[何を] になると思いますか。これは正しいです?

この質問が漠然としているように思われる場合は申し訳ありませんが、ご意見をお寄せいただければ幸いです。SQL Server 2012 を使用しています。

4

1 に答える 1

5

最も選択的な列を左に置くという神話はくだらないです - 申し訳ありません。

複合インデックスは、n 個の左端の引数を使用する場合にのみ役立ちます。たとえば、インデックスがオンになっている場合です。

(when, who, what)

そのインデックスは、について尋ねる質問に答えることができます

(when)

または約

(when, who)

または約

(when, who, what)

に関する質問にはお答えできません

(who, what)

(一番左の列はここでは使用されていないため)。

それが考慮すべき点です。そのような複合インデックスでほとんどの質問に答えることができるように列を並べ替えます。

于 2012-11-26T16:10:59.663 に答える