【问题标题】:Date Table/Dimension Querying and Indexes日期表/维度查询和索引
【发布时间】:2011-04-06 21:07:52
【问题描述】:

我正在创建一个强大的日期表,想知道链接到它的最佳方式。主键聚集索引将位于名称为 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),也许我应该转换我的数据库字段中的日期时间以匹配它并基于该字段进行链接。

大家怎么看?

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

【问题讨论】:

  • 作为我的一般规则(通过艰难的方式学习),我总是避免使用日期时间主键。使用相同的值很容易被烧毁。
  • 您介意详细说明一下吗?
  • 如果您有一个日期时间值的主键,并且您使用 GETDATE() 创建它,那么当多人尝试同时插入时,您迟早会遇到 dup 键失败。或者,如果您从 select 语句中插入,则更容易导致 dup 失败。

标签: tsql indexing sql-server-2000 performance


【解决方案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 的聚集索引的第一列,则它已经覆盖(聚集索引始终包含所有其他字段)。

【讨论】:

  • 那么,将日期时间转换为智能日期键 INT 类型的最高效方法是什么?
  • 你是说改变数据库结构还是不改变?如果您正在谈论更改结构,我不会转换日期时间,我会在 Foo 中添加一个额外的 DateID 列,并在插入记录时用正确的值填充它(加上一次性批处理 opp 以输入值现有记录)。如果您不考虑更改数据库结构,我会坚持我在回答中提出的日期范围方法。
  • 对不起,我错过了这个问题。日期表在名为 DateID 的 INT 字段上已有一个主键聚集索引。 DateID 是一个智能日期字段,这意味着今天的日期将显示为 20100901(9 月 1 日)。
  • 我不确定您所说的“智能日期字段”是什么意思。如果您只是想将datetime 值转换为按照您描述的方式结构化的 int,请尝试DATEPART(year, orderdate) * 10000 + DATEPART(month, orderdate) * 100 + DATEPART(day, orderdate)
  • 谢谢,我将把这部分分成一个不同的问题,以确保人们看到它。感谢您的帮助。
猜你喜欢
  • 2012-02-09
  • 1970-01-01
  • 1970-01-01
  • 2018-03-27
  • 1970-01-01
  • 2018-04-06
  • 1970-01-01
  • 2014-04-28
  • 2013-12-23
相关资源
最近更新 更多