Таблица дат / Запросы размеров и индексы - PullRequest
1 голос
/ 01 сентября 2010

Я создаю надежную таблицу дат, чтобы узнать, как лучше на нее ссылаться. Кластерный индекс первичного ключа будет находиться на целочисленном ключе смарт-даты (согласно спецификации 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 Ответ

1 голос
/ 01 сентября 2010

Даже не изменяя структуру базы данных, вы получите гораздо лучшую производительность при использовании объединения дат:

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, то он уже покрывает (кластеризованный индекс всегда включает все остальные поля).

...