2017-02-21 23 views
0

我有一些有點大表(約2000萬行),並需要存儲bit信息與附加datetime2。我知道我總是隻會查詢bit的信息,而當bit的信息是1時,總會有datetime2信息出現。我正在考慮實施這項兩種方式:存儲和索引datetime2 vs位+日期時間2

一)指標將只包含Enabled

create table Items ( 
    Enabled bit not null, 
    EnabledWhen datetime2 null 
) 

二)指標將只包含Enabled,但查詢將永遠是要麼Enabled is nullEnabled is not null

create table Items (
    Enabled datetime2 null 
) 

哪個版本更高效,爲什麼?

+4

正如Eric Lippert所說,[比賽你的馬](https://ericlippert.com/2012/12/17/performance-rant/) –

+2

然後,正如我所說,不要*存儲*數據可以計算出來,除非或者直到你已經證明了一個實際的性能問題。如果'Enabled'始終在邏輯上跟隨另一列的'null' /'not null'性質,那麼直到你證明了一個問題。然後考慮是否可以讓* system *維護這個計算的數據,而不是自己做(例如持久計算的列,也許?),以便*您*不必確保您的數據是*一致的*。 –

+0

由於選擇性低,「bit」對索引的選擇很差。幾乎可以保證在大多數情況下不會考慮這樣的指數。 – dean

回答

1

如果沒有您的用例,這很難回答。索引比特列的效率會比日期列高一些,因爲索引可能更小並且適合頁面中的更多記錄,但是,添加比特列會使您的表格變寬一點,即效率稍低。

如果您使用的是聚簇索引,請不要添加位列並僅索引日期。

如果這是一個覆蓋的非聚集索引,並且您需要包含日期列,請不要添加位列,而是索引日期。

如果這是針對不需要日期的覆蓋非聚集索引,請使用位列幷包含您所需的列,假設日期不包含,並且您不打算創建另一個非聚集索引日期欄。

一般來說,我認爲位列是浪費空間,因爲用例非常狹窄。