Sql-Server-2008

設計這張里程表的最佳方法是什麼?

  • October 17, 2011

我將填充每加侖英里數 (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

我們是否應該預先計算這些列milesgals儲存在數據庫中?它肯定會使查詢更容易,但會以空間為代價。計算的問題相同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,JOINGROUP BY子句。如果你願意ORDER BY mpg,那麼在之後創建mpg索引鍵的一部分,truck_num而不是僅僅INCLUDE-ing 它。

完成後,按如下方式測試您的設置:

  1. 創建測試表
  2. 將其充滿測試數據
  3. 創建索引
  4. 更新統計
  5. 執行最常見的查詢
  6. 檢查他們的計劃和執行時間

引用自:https://dba.stackexchange.com/questions/6836