0

繰り返しのある列を持つテーブルがあるとします。たとえば、

Column1
---------
    a
    a
    a
    a
    b
    a
    c
    d
    e
    ... so on

多分それは何十万もの行を持っています。次に、この列から個別の値を取得する必要があるとします。で簡単にできますがSELECTDISTINCTパフォーマンスが気になりますか?

また、Column1の各アイテムにIDを指定してから、Column1によって参照される新しいテーブルを作成することもできます(これをより適切に正規化するため)。joinsただし、これにより、挿入の作成がさらに複雑になり、他の可能なクエリが追加されます。

列内の個別の値だけにインデックスを付ける方法はありますか、それとも正規化が唯一の方法ですか?

4

1 に答える 1

1

column1のインデックスを使用すると、個別の処理が大幅に高速化されますが、挿入/更新/削除中にスペースと(短い)時間を交換する場合は、マテリアライズドビューを使用できます。これは、ビュー定義に従って生成および維持される動的テーブルと見なすことができるインデックス付きビューです。

create view view1
with schemabinding
as
   select column1, 
          count_big(*) cnt
     from theTable
    group by column1
-- create unique clustered index ix_view1 on view1(column1)

(コメント付きのcreate indexコマンドを実行することを忘れないでください。通常、ビュー定義にインデックス定義が含まれるようにこの方法で実行し、ビューを変更する必要がある場合に適用するように通知します。)

使用する場合は、必ずnoexpandヒントを追加して、マテリアライズされたデータを強制的に使用してください(この部分は、私には不思議なままです。パフォーマンスの向上として作成されたものは、デフォルトではオンになっておらず、その場でアクティブになっています)。

select *
  from view1 (noexpand)
于 2012-08-31T10:06:00.597 に答える