Jika Anda mencoba membuat tabel Anda tanpa Kendala PK berkerumun, dan Anda akan mendapatkan kesalahan yang sedikit berbeda:
Msg 1701, Level 16, State 1, Line 1 Membuat atau mengubah tabel 'Mytable' gagal karena ukuran baris minimum adalah 8067, termasuk 1530 byte overhead internal. Ini melebihi ukuran baris tabel maksimum yang diijinkan yaitu 8060 byte.
Dalam pesan kesalahan ini, Anda dapat melihat bahwa ada 1530 byte overhead internal untuk kompresi halaman.
Sekarang, Anda dapat melakukan perhitungan:
- 8 byte untuk
bigint
MyTableID
- 4 byte untuk
int
Kolom Terakhir
- 9 byte untuk masing-masing 593
numeric(19,4)
kolom (total 5337 byte)
- 1530 byte kompresi overhead
Jadi, 8 + 4 + (593 * 9) + 1530 = 6879.
Tunggu sebentar .... Itu masih di bawah 8060. Ada apa dengan itu ?!
Algoritma Kompresi Halaman sebenarnya menumpuk beberapa algoritma kompresi bersama. Langkah pertama adalah menerapkan kompresi ROW. Overhead kompresi baris tidak termasuk dalam 1530 byte overhead yang tercantum dalam pesan kesalahan itu.
Anda dapat membaca lebih lanjut tentang cara kompresi baris bekerja di sini di blog saya dan di sini di BOL . Anda akan mencatat di artikel BOL yang menggambarkan numeric
penyimpanan sebagai "Penyimpanan ini persis sama dengan format penyimpanan vardecimal," tetapi tidak menjelaskan vardecimal
. Posting ini mencakup vardecimal
sedikit lebih banyak - pada dasarnya, ia menambahkan 2 byte overhead per kolom untuk menyimpan panjang sebenarnya (mirip dengan apa yang varchar
dilakukan).
Kompresi baris akan membutuhkan tambahan 2 byte untuk masing-masing dari 593 numeric
kolom, ditambah bigint
dan int
akan membutuhkan 1 byte masing-masing overhead.
The baris-dikompresi persyaratan penyimpanan akan menjadi:
- 8 byte + 1 byte overhead untuk
bigint
MyTableID
- 4 byte + 1 byte overhead untuk
int
LastColumn
- 9 byte + 2 byte overhead untuk masing-masing 593
numeric(19,4)
kolom
- 1188 byte overhead kompresi ROW
8 + 4 + (593 * 9) = 5349 byte data
1 + 1 + (593 * 2) = 1188 byte kompresi baris atas
Total 6537 byte untuk skema kompresi baris
Sekarang kita memiliki ukuran baris untuk skema terkompresi baris, kita dapat meninjau kembali matematika kita. Ukuran baris yang dikompresi halaman akan menjadi ukuran data + overhead kompresi baris + overhead kompresi halaman:
- 8 byte untuk
bigint
MyTableID
- 4 byte untuk
int
Kolom Terakhir
- 9 byte untuk masing-masing 593
numeric(19,4)
kolom
- 1188 byte overhead kompresi ROW
- 1530 byte overhead kompresi PAGE
5349 byte data
+ 1188 byte kompresi baris atas
+1530 byte kompresi overhead halaman
Total 8067 byte