2010-09-01 41 views
1

我正在創建一個可靠的日期表,以瞭解鏈接到它的最佳方式。主鍵集羣索引將在名稱爲DateID的智能日期整數鍵(每個Kimball規格)上。到現在爲止我一直在執行相關查詢,像這樣:日期表/維度查詢和索引

select Foo.orderdate -- a bunch of fields from Foo 
     ,DTE.FiscalYearName 
     ,DTE.FiscalPeriod 
     ,DTE.FiscalYearPeriod 
     ,DTE.FiscalYearWeekName 
     ,DTE.FiscalWeekName 
     FROM SomeTable Foo 
    INNER JOIN 
     DateDatabase.dbo.MyDateTable DTE 
    ON DTE.date = CAST(FLOOR(CAST(Foo.forderdate AS FLOAT)) AS DATETIME) 

請記住,日期與價值觀,如非聚集索引字段: 2000-01-01 00:00:00.000

它剛剛發生在我身上,因爲我有一個聚集整數索引(DATEID),也許我應該將數據庫字段中的日期時間轉換爲匹配它並基於該字段進行鏈接。

你們有什麼想法?

此外,根據您的第一個答案,如果我通常從日期表中拉出這些字段,我該如何優化這些字段的檢索?覆蓋指數?

+1

作爲我的一般規則(學會了艱難的道路),我總是避免使用日期時間主鍵。您可以輕鬆地使用相同的值進行刻錄。 – 2010-09-01 15:25:58

+0

你介意說明一下嗎? – DavidStein 2010-09-01 15:51:32

+0

如果您有一個主鍵是日期時間值,並且您使用GETDATE()創建它,那麼當多個人嘗試同時插入時,您遲早會得到一個複製鍵失敗。或者,如果您從select語句插入,則更容易發生dup重複失敗。 – 2010-09-01 17:25:44

回答

1

即使不改變數據庫結構,您使用的日期範圍會得到更好的性能加入這樣的:

select Foo.orderdate -- a bunch of fields from Foo 
    ,DTE.FiscalYearName 
    ,DTE.FiscalPeriod 
    ,DTE.FiscalYearPeriod 
    ,DTE.FiscalYearWeekName 
    ,DTE.FiscalWeekName 
    FROM SomeTable Foo 
INNER JOIN 
    DateDatabase.dbo.MyDateTable DTE 
ON Foo.forderdate >= DTE.date AND Foo.forderdate < DATEADD(dd, 1, DTE.date) 

但是,如果讓你的Foo表包括DateID場,那麼你可以改變它,是的,您可以通過加入而不是任何轉換日期值或日期範圍來獲得最佳表現。

如果將其更改爲加入DateID並且DateID是MyDateTable的聚簇索引的第一列,那麼它已經覆蓋(聚簇索引始終包含所有其他字段)。

+0

那麼,將日期時間轉換爲智能日期鍵INT類型的最高性能方法是什麼? – DavidStein 2010-09-01 15:52:07

+0

你是否在談論改變數據庫結構?如果您正在討論更改結構,我不會轉換日期時間,我會爲Foo添加一個額外的DateID列,並在插入記錄時使用正確的值填充它(加上一次性批量opp以輸入值現有記錄)。如果你不想改變數據庫結構,我會堅持使用日期範圍的方法,我把它放在我的答案中。 – 2010-09-01 15:54:58

+0

對不起,我錯過了這個問題。日期表已在稱爲DateID的INT字段上具有主鍵聚簇索引。 DateID是一個智能日期字段,這意味着今天的日期將顯示爲20100901(9月1日)。 – DavidStein 2010-09-01 16:01:32