Di Microsoft SQL Server, data (termasuk indeks) disimpan dalam satu atau lebih "halaman" 8k (8192 byte). Ada berbagai jenis halaman yang dapat digunakan untuk menangani berbagai situasi (misalnya Data, LOB, Index, AllocationMap, dll) . Setiap halaman memiliki header yang merupakan meta-data tentang halaman tersebut dan isinya.
Sebagian besar data disimpan di baris itu sendiri, dan satu atau lebih baris ini pada gilirannya disimpan di halaman untuk "data dalam baris". Karena ruang yang diambil oleh header baris, baris terbesar yang dapat dibuat (untuk data "dalam baris") adalah 8060 byte.
Namun, tidak semua data disimpan dalam baris. Untuk tipe data tertentu, data sebenarnya dapat disimpan pada halaman "data LOB" sementara pointer tertinggal di data "dalam-baris":
-
Jenis LOB lama/tidak digunakan lagi yang tidak boleh digunakan lagi (
TEXT
,NTEXT
, danIMAGE
), secara default, selalu simpan datanya di halaman LOB dan selalu gunakan pointer 16 byte ke halaman LOB tersebut. -
Jenis LOB yang lebih baru (
VARCHAR(MAX)
,NVARCHAR(MAX)
,VARBINARY(MAX)
, danXML
), secara default, akan mencoba menyesuaikan data secara langsung di baris jika cocok. Jika tidak, ia akan menyimpan data pada halaman LOB dan menggunakan pointer 24-72 byte (tergantung pada ukuran data LOB).
Ini adalah bagaimana Anda dapat menyimpan hingga 78 GB + 4 byte (jangan lupa tentang INT
Kunci Utama;-) dalam satu baris:ukuran baris maksimum adalah antara 940 byte ((39 * 24) + 4) dan 2812 byte ((39 * 72) + 4). Tapi sekali lagi, itu hanya kisaran maksimum; jika data di masing-masing 39 VARCHAR(MAX)
kolom hanya 10 byte, maka semua data akan disimpan dalam baris dan ukuran baris akan menjadi 394 byte ((39 * 10) + 4).
Mengingat bahwa Anda memiliki begitu banyak bidang dengan panjang variabel (apakah MAX atau tidak), satu-satunya cara untuk memperkirakan ukuran baris di masa mendatang adalah dengan memiliki gagasan bagus tentang data apa yang akan Anda simpan di tabel ini. Meskipun, tabel dengan semua, atau bahkan sebagian besar, tipe data MAX menyiratkan bahwa tidak ada yang benar-benar tahu apa yang akan disimpan dalam tabel ini.
Sejalan dengan itu, harus ditunjukkan bahwa ini adalah tabel yang dimodelkan dengan buruk / penggunaan bidang tipe data MAX yang mengerikan, dan harus difaktorkan ulang.
Untuk detail lebih lanjut tentang bagaimana halaman data disusun, silakan lihat jawaban saya untuk pertanyaan DBA.StackExchange berikut:
SUM DATALENGTHs tidak cocok dengan ukuran tabel dari sys.allocation_units