Sql-Server-2008
設計這張里程表的最佳方法是什麼?
我將填充每加侖英里數 (MPG) 表。它來自里程表源。
目前是這樣設置的:
id (primary_key) , truck_num , start_date , end_date , start_miles , end_miles , start_fuel , end_fuel , miles , gals , mpg
似乎有一些冗餘。是
miles
,(end_miles - start_miles)
同上gals
。我們是否應該預先計算這些列
miles
並gals
儲存在數據庫中?它肯定會使查詢更容易,但會以空間為代價。計算的問題相同mpg
。計算列會減慢速度,不是嗎?什麼索引最有效?每周大約有 3000 輛卡車(記錄)分批插入。
我正在使用 SQL Server 2008 R2。
編輯:我將使用的範例查詢
-- find average mpg for since ytd select m.truck_num, avg(mpg) from mpg m join truck t on t.truck_num = m.truck_num where start_date >= @begin_of_year and end_date <= @today group by truck_num
- 計算列是您的朋友。 使用它們來擷取您無論如何都要進行的簡單計算,並保證計算值是正確的。
- 如果要對結果進行索引或過濾,請保留結果;如果您只需要偶爾提取值,請不要堅持它們。
- 使用約束擷取所有數據
CHECK
約束。這是一個偽模式定義:
id PRIMARY KEY , truck_num , start_date , end_date CHECK (end_date > start_date) , start_miles CHECK (start_miles >= 0) , end_miles CHECK (end_miles > start_miles) -- what if they refill the tank? , start_gals CHECK (start_gals >= 0) , end_gals CHECK (end_gals < start_gals AND end_gals >= 0) -- all these should be computed , miles = end_miles - start_miles , gals = start_gals - end_gals , mpg = miles/gals
至於索引表,這就是我的想法:
- **群集上
start_date ASC
。**這將滿足您的WHERE
條款。您總是通過增加來插入數據start_date
,這意味著在此集群方案下您的寫入將始終是順序的。您也總是在查詢,start_date
因此您也可以滿足您最大的查詢模式。(每週 3,000 次插入不算什麼。因為您的插入量如此之低,您甚至可以聚集在start_date ASC, end_date ASC
.)- **
truck_num
在和上創建非聚集索引INCLUDE mpg
。**這應該滿足您的SELECT
,JOIN
和GROUP BY
子句。如果你願意ORDER BY mpg
,那麼在之後創建mpg
索引鍵的一部分,truck_num
而不是僅僅INCLUDE
-ing 它。完成後,按如下方式測試您的設置:
- 創建測試表
- 將其充滿測試數據
- 創建索引
- 更新統計
- 執行最常見的查詢
- 檢查他們的計劃和執行時間