2009-08-31 2 views
11

Для вас дизайн базы данных/гуру производительности там.SQL Server Datetime vs Int key performance

Если у вас есть база данных, предназначенная для отслеживания финансовых данных за периоды финансового года, лучше/более эффективна/более ясна, чтобы выполнять поиск типа типа Daterange, например PaymentDate между X и Y, или лучше хранить int- ключевую таблицу с определенными в ней периодами финансового года и пометить таблицу платежей датой платежа и этим ключом, поэтому в предложении where есть FiscalPeriodID = X?

Я уверен, что для меньших наборов данных это не имеет значения, но предположим, что эти данные будут в миллионах строк.

ответ

18

Я ежедневно разбираюсь со складами в миллионах строк, и мы находим, что ключи умных дат - это путь. Это в формате YYYYMMDD. Таким образом, чтобы найти все 2008, вы могли бы сделать:

select 
    * 
from 
    gl 
where 
    postdate between 20080101 and 20081231 

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

Конечно, эти склады обычно построены для поддержки кубов SSAS (баз данных OLAP), и поэтому таблица даты становится нашим измерением даты. Гораздо быстрее присоединиться к int, чем к дате.

+0

HRM да, теперь, когда я могу взять то, что вы написали и исследования это, похоже, это довольно стандартное решение, особенно в кубах. – Eric

+1

Как насчет 'времени'? Что делать, если мне тоже нужно хранить время? Хорошо ли использовать отдельное поле для времени, а также хранить его в качестве межсетевого экрана и делать конверсию, когда это необходимо? – Mahmoodvcs

+1

Дэвид Штайн написал статью об этом. Он говорит, что поле даты имеет производительность beter в SQL 2008. URL: [http://www.made2mentor.com/2011/05/date-vs-integer-datatypes-as-primary-key-for-date-dimensions/] (http://www.made2mentor.com/2011/05/date-vs-integer-datatypes-as-primary-key-for-date-dimensions/) – Mahmoodvcs

0

Что вы в конечном итоге делаете со значительными финансовыми наборами данных - это «кубы данных».

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

Так что это не имеет значения. Храните его, однако, и создайте историческую базу данных, которая будет более эффективной для долгосрочной отчетности.

Я отправился с датой, хранящейся непосредственно против записи.

0

Если вы можете использовать smalldatetime, то он будет иметь тот же размер, что и целое число - оба 4 байта. И под капотом datetime datatypes являются целыми числами.

Первые 2 байта smalldatetime являются чем-то вроде количества дней, прошедших с того момента, когда возможно 1/1/1900, а во втором 2 байта - это количество секунд, прошедших с полуночи. (Это может быть не совсем точно, но вы понимаете суть.) Таким образом, эти типы данных очень эффективны.

Я думаю, что предложение where, выполненное против поля smalldatetime, будет в порядке.

2

рассмотреть Кроме того, что в действительности дата часть фактической DateTime или smalldatetime поля ... 4-байтовое целое число, представляющее количество дней с 1 январем 1900 г.

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

вы также можете использовать его в предложениях Where против фактических значений даты и времени, поскольку механизм SQL Server неявно преобразует один к другому и обратно.

Плюс, каждый possile значение 32-бит (4 байта) целое число является действительным DateTime (Полночь) для внутреннего SQL Server Datetime тип данных