日期表/维度查询和索引

时间:2010-09-01 15:11:49

标签: tsql indexing sql-server-2000 performance

我正在创建一个强大的日期表,希望了解链接到它的最佳方式。主键聚簇索引将位于智能日期整数键(每个Kimball规范)上,其名称为DateID。到目前为止,我一直在对它进行查询:

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)

请记住,Date是一个非聚集索引字段,其值如下: 2000-01-01 00:00:00.000

我刚刚发现,因为我有一个聚簇整数索引(DATEID),或许我应该在我的数据库字段中转换日期时间以匹配它并基于该字段进行链接。

你们有什么想法?

另外,根据您的第一个答案,如果我通常从日期表中提取这些字段,那么我该如何优化这些字段的检索?覆盖指数?

1 个答案:

答案 0 :(得分: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的聚集索引的第一列,则它已经覆盖(聚簇索引始终包含所有其他字段)。