Эффективность 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, будет прекрасным.