0

デバイス ID (int)、logdate (日時)、および値 (10 進数) (SQL Server 2008) で構成される測定値を保存するテーブルを作成する必要があります。測定値は常に四半期で、たとえば 00:00、00:15、00:30、00:45、01:00、01:15 などです。そのため、特定の日付以降の四半期の量を定義する int を考えていました。 datetime よりも優れたパフォーマンスが得られます。

通常、取得は次の方法で行います。

  -where DeviceId = x and QuarterNumber between a and b
  -where DeviceId in (x, y, ...) and QuarterNumber between a and b
  -where DeviceId = x and QuarterNumber = a

このテーブルに最適なデザインは何ですか?

PK DeviceId int
PK QuarterNumber int
   Value int

また

PK MeasurementId int
UQ QuarterNumber int
UQ DeviceId int
   Value int

(UQ=ユニークインデックス)

それともまったく違うものですか?

ありがとう!

4

2 に答える 2

1

何百万もの行がある場合、特定の日付から 15 分の 1 時間の数を定義することによって、SELECT のパフォーマンスがわずかに向上する可能性があります。

個人的には、わずかなパフォーマンスの向上は読みやすさの低下に見合うものではないと思います。また、15 分の仮定に基づいて設計するのも好きではありません。(私の経験では、この種の要件は時間の経過とともに変化することがよくあります。) datetime 列に今すぐ 15 分の CHECK 制約を含め、その要件が変更された場合は後で削除することができます。

しかし、テストして測定できる場合、意見に頼っても意味がありません。3 つのテーブルを作成し、数百万行のサンプル データを読み込み、クエリ プランを検討します。(各テーブルに 5,000 万行をロードすることは完全に非現実的というわけではありません。SO に関する質問に答えるときに、テスト テーブルに 2,000 万行をロードすることがあります。) インデックス作成の最初の試みが最適であると思い込まないでください。複数のインデックスを検討し、複数列のインデックスも検討してください。

于 2012-08-03T08:24:46.027 に答える
0

I dont think there can be any specific guidelines for your criteria. You might need to create and test(you can insert a demo data in each). Since you want performance improvement I would suggest the use of index in your table.

于 2012-08-03T09:19:26.360 に答える