2012-08-03 79 views
0

我需要創建一個表,保存包含設備id(int),logdate(datetime)和值(十進制)(SQL Server 2008)的測量值。測量總是在本季度。 00:00,00:15,00:30,00:45,01:00,01:15 ...所以我在想,定義自某個日期以來宿舍數量的整數將導致更好的性能約會時間。測量的最佳性能表設計

檢索通常會使用來完成以下事項:

-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 =唯一索引)

或完全不同的東西?

謝謝!

+0

您期望錄製多少個季度?您希望註冊多少設備? – Andrew 2012-08-03 08:15:25

+0

大約100.000個設備,我會爲每個設備保留大約96 * 5個宿舍。 – Bruno 2012-08-03 08:17:28

+0

我總是傾向於選擇2.在這種情況下,我不知道哪個更好。選項2意味着你會意味着更大的表和索引,但我認爲插入會更快。我認爲對於選項1,由於PK上的聚集索引,您可能會遇到問題。 – Andrew 2012-08-03 08:25:56

回答

1

如果您擁有數百萬行,則您可以通過定義特定日期以來的四分之一小時數來獲得稍好的SELECT性能。

就個人而言,我並不認爲邊際績效增益值得降低可讀性。我也不喜歡以一刻鐘的假設爲基礎進行設計。 (根據我的經驗,這種需求通常會隨着時間的推移而變化。)您現在可以在的日期時間列上包含一個四分之一小時的CHECK約束,如果需求發生更改,則可以稍後將其刪除。

但是,當您可以測試和測量時,依靠意見沒有意義。建立三個表格,加載數百萬行樣本數據,並研究查詢計劃。 (這不是完全是在每個表中加載5000萬行是不切實際的,在回答關於SO的問題時,我有時會將2000萬行加載到測試表中。)不要認爲您的第一次嘗試索引是最優的。考慮多個索引,並考慮多列索引。

0

我不認爲你的標準可以有任何具體的指導方針。您可能需要創建和測試(您可以在每個插入演示數據)。既然你想要提高性能,我會建議你在表格中使用索引。