2012-02-24 9 views
1

SQL Server 2008 Enterpriseバージョンを使用しています。私たちは大きなテーブルFooTable(数十億行)を持っています。SQL Serverの日付列を変更するためのクラスタードインデックスのパフォーマンスの問題

FooTable列:site:varchar(7), device:varchar(7), time(datetime), value(float)

毎日、私たちは新しい数百万行を挿入します。

site,deviceおよびtime(順番に)のクラスタ化インデックスを作成しました。

私たちが見る通り、sitedeviceは比較的一定ですが、timeは時間が経つにつれて変化し続けます。このテーブルに対して実行

クエリは次のようになります。

  1. INSERT INTO FooTable SELECT * FROM #BULK_INSERTED_TEMP_TABLE

  2. SELECT value FROM FooTable WHERE site = 'fooSite' AND device = 'fooDevice' AND time = 'fooTime'

  3. SELECT SUM(value) FROM FooTable WHERE site = 'fooSite' AND device = 'fooDevice' AND time > 'startTime' AND time <= 'endTime'

最高のクラスタ化インデックスのデザインとは何ですか?

+1

テーブルにアクセスするクエリについて何も知らなくても、確実に言うことはできません。 'site、device、time'は断片化につながります。 –

+1

**テーブル構造**を表示できますか?(データ型は重要です!!列名だけでなく.....)また、どのような**クエリ**のようにそのテーブルに期待していますか?どのような他のインデックス(ノンクラスターのもの)がありますか? –

+0

+1。また、どのようなsoftwaerですか?エンタープライズ版?サイトごとにパーティション化されたテーブルを使用したいかもしれません...インデックスから外してください;)partitioendテーブルを使用するには、エンタープライズエディションが必要です。 – TomTom

答えて

1

最高のクラスタード・インデックス設計の真の答えはありません。一般に、私はクラスタード・インデックスを2つの方法で調べます。第一に、彼らはデータを保存するので、あなたはそれらをデータストレージの観点から考える必要があります。新しいデータが到着しても常にページを分割する可能性の高いクラスタを作成していますか?第2に、データを格納するため、データの取得に最も頻繁に使用されるクエリを検討する必要があります。これらのクエリは、クラスタード・インデックスを使用してデータを取得できますか?

設定については何も知らないうちに、クラスタ化インデックスに最適な選択肢がありますか?私はおそらくそうではないと言います。あなたが定義したのは、有効な主キー候補ですが、あなたが概説した構造と、データを特定の構造にグループ化する2つの列と、最初の2つの列の分布内の場所は、ページ分割をたくさん見ていることを示唆しています。それは問題かもしれませんが、モニターする必要があります。

+0

私は主にパフォーマンスに重点を置いていますが、スペースも考慮する必要がありますが、パフォーマンスほど重要ではありません。これらの3つの列は毎日の使用量の99%をカバーするため、それらをすべて一緒に使用する必要があります。しかし、断片化、ページ分割、新しいレコードが到着している間の並べ替えの場合、パフォーマンスが低下する可能性があります。 – unruledboy

+0

スペースは私の考慮事項ではありませんでした。索引の断片化はスペースを増やしますが、パフォーマンスのヒットはこれが大きな問題です。あなたのデータを知らないので、そのヒットがどれくらい大きいかは分かりませんが、私の評価では重点を置いています。 –

+0

あなたが追加したクエリに基づいて、ええ、それはおそらく私が使用することになるクラスタ化されたキーですが、再度、ページ分割をたくさん見ているかもしれません。他のパフォーマンスの問題は、ページを並べ替える行為であり、デザインをテストするときに監視する他のものです。 –

関連する問題