2010-09-01 7 views
1

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

Имейте в виду, что дата является некластеризованным индекс поля со значениями, такими как: 2000-01-01 00: 00: 00,000

Это только что случилось с тем, что, поскольку у меня есть кластерный целочисленный индекс (DATEID), возможно, мне следует преобразовать дату-время в поле моей базы данных, чтобы он соответствовал ему и привязывался на основе этого поля.

Что вы, люди, думаете?

Кроме того, в зависимости от вашего первого ответа, если я обычно вытягиваю эти поля из таблицы дат, какой индекс я могу оптимизировать для поиска этих полей? Индекс покрытия?

+1

Как правило, я знаю, что я всегда избегаю первичного ключа datetime. Вы можете легко сжечь одинаковые значения. –

+0

Не могли бы вы рассказать об этом? – DavidStein

+0

, если у вас есть первичный ключ, который является значением даты и времени, и вы создаете его с помощью GETDATE(), то рано или поздно вы получите отказ ключа ключа, когда несколько человек попытаются вставить одновременно. ИЛИ, если вы вставляете из оператора select, еще проще получить дубликаты. –

ответ

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

+0

Вы говорите об изменении структуры базы данных или нет? Если вы говорите об изменении структуры, я бы не преобразовал дату-время, я бы добавил дополнительный столбец DateID в Foo и заполнил его правильным значением при вставке записей (плюс одноразовый пакетный opp для ввода значений для существующие записи). Если вы не собираетесь изменять структуру базы данных, я бы придерживался подхода диапазона дат, который я ввел в свой ответ. –

+0

Извините, я пропустил этот вопрос. В таблице даты уже есть кластерный индекс первичного ключа в поле INT с именем DateID. DateID - это поле умной даты, означающее, что сегодняшняя дата будет отображаться как 20100901 (1 сентября). – DavidStein