2010-09-01 39 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