Эффективность SQL-сервера Datetime vs Int
Для вас создатели базы данных/гуру производительности там.
Если у вас есть база данных, предназначенная для отслеживания финансовых данных за периоды финансового года, лучше/более эффективна/более ясна, чтобы выполнять поиск типа типа daterange, например PaymentDate между X и Y, или лучше хранить int-key на основе таблицы с отчетными годами, определенными в ней, и пометьте таблицу платежей датой платежа и этим ключом, поэтому предложение where - это где FiscalPeriodID = X?
Я уверен, что для меньших наборов данных это не имеет значения, но пусть предполагается, что эти данные будут в миллионах строк.
Ответы
Ответ 1
Я ежедневно разбираюсь со складами в миллионах строк, и мы находим, что клавиши умных дат - это путь. Это в формате YYYYMMDD. Итак, чтобы найти весь 2008 год, вы бы сделали:
select
*
from
gl
where
postdate between 20080101 and 20081231
С индексированным столбцом это феноменально быстро, даже через один миллиард строк. Это также указывает на таблицу с датами, поэтому мы можем использовать в качестве метки день недели, месячные имена или любую другую информацию о датах, которые у нас есть с этим соединением.
Конечно, эти склады обычно создаются для поддержки кубов SSAS (баз данных OLAP), и поэтому таблица даты становится нашим измерением даты. Это намного быстрее, чтобы присоединиться к int, а не к datetime.
Ответ 2
Также рассмотрите, что на самом деле является частью даты в поле Actual datetime или smalldatetime... 4-байтовое целое число, представляющее количество дней с 1 января 1900 года.
Это может быть передано фактическому дате времени неявно, очень быстро (поскольку это то же самое значение, что и первые четыре байта 8-байтового значения DateTime)
вы также можете использовать его в предложениях Where против фактических значений даты и времени, поскольку механизм SQL Server неявно преобразует его в другой и обратно.
Кроме того, каждое возможное значение 32-битного (4-байтового) целого числа является допустимым дат-временем (Midnight) для внутреннего типа данных Datetime SQL Server
Ответ 3
То, что вы делаете со значительно большими финансовыми наборами данных, это "кубы данных".
Это в основном относится к процессу генерации отчетов, которые вам нужны для каждого периода, исторически, поэтому вам не нужно делать эти предложения where
, вы просто просматриваете данные за этот период.
Так что это не имеет значения. Храните его, однако, и создайте историческую базу данных, которая будет более эффективной для долгосрочной отчетности.
Я бы пошел с датой, хранящейся непосредственно против записи.
Ответ 4
Если вы можете использовать smalldatetime, то он будет иметь тот же размер, что и целое число - как 4 байта. И под капотом datetime datatypes являются целыми числами.
Первые 2 байта smalldatetime - это что-то похожее на количество прошедших дней, так как может быть 1/1/1900, а во втором 2 байта - это количество секунд, прошедших с полуночи. (Это может быть не совсем точно, но вы понимаете суть.) Таким образом, эти типы данных очень эффективны.
Я думаю, что предложение where, выполняемое против поля smalldatetime, будет прекрасным.