2012-03-21 16 views
2

SQL Serverのバックエンドでdjangoを使用しています。Djangoによるクラスタ化インデックスの選択

テーブルの一部が非常に大きくなります。一般化した例撮影:

CREATE TABLE [dbo].[Data](
    [id] [int] NOT NULL, 
    [project_id] [int] NOT NULL, 
    [timestamp] [datetime] NOT NULL, 
    [value] [float]) 

[Data].[project_id][Project].[id]への外部キーです。

[Task].[id]に私はPKインデックスを持っています。これは、djangoの練習に合わせて自動インクリメントします。

また、重複するデータを防ぐために、[Data].[project_id],[Data].[timestamp]にユニークなインデックスを設定します。

私のクエリの大半が[Data].[project_id],[Data].[timestamp]で検索されている場合は、このインデックスをクラスタ化するのが最善でしょうか、またはdjangoがdbとやり取りする方法は、クラスタリングを主キーに残すべきですか?

ありがとうございます!

答えて

0

あなたがPROJECT_IDのユニークなクラスタ化インデックスを作成した場合、タイムスタンプ

  • クエリの大半は、クラスタ化インデックスによって満たされることになる非クラスタ化インデックスの必要性があるように表示されません
  • 求めます
  • は、あなたはすでにあなたが特定の日付で探している場合は、タイムスタンプを使用すること

は、PROJECT_IDは有効な引数になり、インデックスを計画しているが、ほとんどの人は、日付をある範囲で照会します。そうすれば、日付範囲を探すことができますが、そのデータをスキャンしてproject_idを見つけなければなりません。 SQL Serverはシークとして、Seek Predicateとしてタイムスタンプを、Predicateとしてproject_idを表示します。あなたの目標はできるだけシークプレディケートで扱うことです。

しかし、これは完璧な答えだとは言い難いです。これが正しいかどうかを知る唯一の方法は、数日待ってからdm_db_index_usage_statsをチェックして、実際にはこのテーブルのほとんどの使用が実際にproject_id、timestampにあるかどうかを確認することです。もしdjangoがそれらをあなたが期待しているものと異なって使用しているのであれば、単にこれをIDに変更すると意味があります。

関連する問題