datetime2 (0) vs datetime2 (2)


16

Відповідно до документації datetime2 (Transact-SQL) :

Розмір пам’яті
6 байт для точок менше 3.
7 байт для точок 3 та 4. Для
всіх інших точок потрібно 8 байт.

Розмір datetime2(0), datetime2(1), datetime2(2)використовувати один і той же обсяг пам'яті (6 байт).

Чи буду я правильним, кажучи, що я міг би також datetime2(2)отримати та отримати перевагу точності без додаткових витрат на розмір?

Будь ласка, запиши:

  • Цей стовпець індексується PK для формування складного кластерного індексу (використовується для розділення таблиці)
  • Мене не хвилює мілісекунд

Буде datetime2(0)ефективніше процесор, коли він використовується в пункті де або при пошуку за допомогою індексу?

Це масивна таблиця, тому найменша оптимізація матиме велике значення.

Відповіді:


27

Розмір dateTime2 (0), dateTime2 (1), dateTime2 (2), dateTime2 (3) використовує однаковий обсяг пам’яті. (6 байт)

Чи правильно я б сказав, що я міг би також перейти з dateTime2 (3) і отримати користь від точності без додаткових витрат на розмір.

Ні, ви неправильно трактували документацію. Зауважте, що в документі зберігається розмір 6 байт для точності менше 3 (акцент мій). Тож для точності, рівній 3, знадобиться 7 байт.

Якщо вас не хвилює мілісекунд, datetime2(0)це буде правильний тип даних та точність. Найкращою практикою є визначення правильного типу даних та точності на основі даних, що зберігаються, оскільки це по суті забезпечить оптимальне зберігання та ефективність. Зважаючи на це, я не очікував би суттєвого впливу на ефективність, що базується на заданій точності datetime2, доки розмір пам’яті буде однаковим, але я спеціально цього не перевіряв.

Вимоги до програми визначають, що потрібно зберігати в базі даних, коли в джерелі буде доступна більша точність. Наприклад, для джерела введення замовлення, отриманого від SYSDATETIME(), користувачі можуть не бажати точності 100 наносекунд. Знову ж таки, виберіть тип даних та точність для нової розробки відповідно до вимог, і ви, як правило, отримаєте оптимальну продуктивність без додаткових роздумів:

  • побачення - вам не потрібен час
  • smalldatetime - вам не потрібні секунди
  • datetime2 (0) - вам не потрібні дробові секунди
  • datetime2 (1-7) - потрібні дробові секунди заданої точності
  • зсув дати (0-7) - вам потрібна дата та час із усвідомленням часового поясу
  • час (0-7) - потрібен лише час (без дати) з дробовими секундами заданої точності

Хоча datetime2 є найбільш підходящим для нової розробки, як перераховано вище, іноді може знадобитися використовувати datetime (фіксовану точність 3 з точністю 1/300 дробових секунд) замість сумісності зі застарілими програмами datetime, таким чином уникаючи неявних перетворень та несподіваної поведінки порівняння, але на витрата дробової другої точності та збільшення зберігання.

Врахуйте, що зберігання більшої точності, ніж потрібно, також може мати витрати на розробку. Якщо хтось зберігає часовий компонент з дробовими секундами, коли потрібна лише ціла друга точність, запити все одно повинні будуть враховувати дробові секунди, щоб повернути правильні результати. Наприклад, із додатком, де користувач вибирає часовий діапазон за допомогою інтерфейсу користувача, який дозволяє лише цілі секунди, коду додатка потрібно буде враховувати дробові секунди у значенні діапазону кінцевого часу та відповідно коригувати надане користувачем значення (наприклад, WHERE OrderEntryTime BETWEEN '2017-01-11T08:00:00.00.00' AND '2017-01-11T08:59:59.99'або WHERE OrderEntryTime >= '2017-01-11T08:00:00.00' AND OrderEntryTime < '2017-01-11T09:00:00.00'). Це додасть складності коду.


Вибачте, що натикаєтесь на цю стару тему лише за цю крихітну ноту, але smalldatetime має цілі секунди (тобто hh: mm: ss).
pgfiore


@pgfiore, документації вказується точність в одну хвилину , і ви побачите , що це правильно з . smalldatetimeSELECT CAST(GETDATE() AS smalldatetime);
Дан Гузман
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.