Якщо ви спробуєте створити свою таблицю без кластерного обмеження ПК, ви отримаєте дещо іншу помилку:
Msg 1701, рівень 16, стан 1, рядок 1 Створення або зміни таблиці "Mytable" не вдалося, оскільки мінімальний розмір рядка складе 8067, включаючи 1530 байт внутрішніх накладних даних. Це перевищує максимально допустимий розмір рядка таблиці 8060 байт.
У цьому повідомленні про помилку ви бачите, що для стиснення сторінки є 1530 байт внутрішніх накладних витрат.
Тепер ви можете займатися математикою:
- 8 байт для
bigint
MyTableID
- 4 байти для
int
LastColumn
- 9 байт для кожного з 593
numeric(19,4)
стовпців (всього 5337 байт)
- 1530 байт стиснення накладних витрат
Отже, 8 + 4 + (593 * 9) + 1530 = 6879.
Почекайте секунду .... Це ще нижче 8060. Що з цим ?!
Алгоритм стиснення сторінки фактично складає кілька алгоритмів стиснення разом. Перший крок - застосувати стиснення ROW. Накладні витрати на стиснення рядків не включаються в 1530 байт накладних даних, перелічених у цьому повідомленні про помилку.
Ви можете прочитати більше про те, як працює стиснення рядків тут, у моєму блозі та тут, у BOL . У статті BOL ви зазначите, що він описує numeric
сховище як "Цей сховище точно такий же, як і формат зберігання вардецимального", але не пояснює vardecimal
. Ця публікація охоплює vardecimal
трохи більше - по суті, вона додає 2 байти накладних витрат на стовпець, щоб зберігати фактичну довжину (аналогічно тому, що varchar
робить).
Для стиснення рядків потрібно буде додатково 2 байти для кожного з 593 numeric
стовпців, плюс bigint
і int
буде потрібно 1 байт накладних даних у кожному.
Вимоги до пам’яті стиснених рядків будуть:
- 8 байт + 1 байт накладних витрат для
bigint
MyTableID
- 4 байти + 1 байт накладних витрат для
int
LastColumn
- 9 байт + 2 байти накладних даних для кожного з 593
numeric(19,4)
стовпців
- 1188 байт скорочення стиснення ROW
8 + 4 + (593 * 9) = 5349 байт даних
1 + 1 + (593 * 2) = 1188 байт стискання рядкових накладних витрат
Загальна кількість 6537 байт для схеми, стиснутої рядками
Тепер, коли у нас є розмір рядка для стиснутої рядком схеми, ми можемо переглянути нашу математику. Розмір рядка, стисненого сторінкою, буде розміром даних + накладні витрати на стиснення рядків + накладні витрати на стиснення сторінки:
- 8 байт для
bigint
MyTableID
- 4 байти для
int
LastColumn
- 9 байт для кожного з 593
numeric(19,4)
стовпців
- 1188 байт скорочення стиснення ROW
- 1530 байт PAGE стиснення накладних витрат
5349 байт даних
+ 1188 байт стискання рядкових накладних витрат
+ 1530 байт сторінки стиснення накладних витрат
8067 байт усього