Dalam SQL Server, mengapa tinyint disimpan dengan 9B di baris. Untuk beberapa alasan tampaknya ada tambahan satu byte pada akhir bitmap mask NULL.
GUNAKAN tempdb; PERGILAH CREATE TABLE tbl ( SAYA TINYINT TIDAK NULL ); PERGILAH INSERT INTO tbl (i) NILAI (1); PERGILAH DBCC IND ('tempdb', 'tbl', - 1); PERGILAH DBCC TRACEON (3604); - Halaman dump akan masuk ke konsol PERGILAH HALAMAN DBCC ('tempdb', 1.168,3); PERGILAH
Hasil (Saya membalikkan byte karena DBCC PAGE menunjukkan byte paling signifikan pertama):
Record Size = 9B
10000500 01010000 00
TagA = 0x10 = 1B
TagB = 0x00 = 1B
Null Bitmap Offset = 0x0005 = 2B
Our integer column = 0x01 = 1B
Column Count = 0x0001 = 2B
NULL Bitmap = 0x0000 = 2B (what!?)
sql-server-2008
ooutwire
sumber
sumber
Jawaban:
Jika Anda menghitung catatan menggunakan penambahan ukuran sederhana Anda memang mendapatkan 8: 4 + 1 + 2 + 1 (header + ukuran tetap + jumlah bitmap nol + bitmap nol itu sendiri). Tetapi catatan tumpukan tidak boleh lebih kecil dari ukuran rintisan penerusan , yaitu 9 byte, karena catatan harus menjamin bahwa itu dapat diganti dengan rintisan penerusan. Oleh karena itu, catatan akan benar-benar 9 byte. A
smallint
akan menjadi 9 byte baik dengan cara menghitung dan ukuran min. Apa pun yang lebih besar sudah lebih besar daripada rintisan penerusan, sehingga ukuran komputasi Anda cocok dengan ukuran rekaman.sumber
CREATE TABLE tbl (i TINYINT NOT NULL PRIMARY KEY)
jadi apakah itu hanya aturan umum untuk semua baris apakah mereka merupakan bagian dari heap?alter table ... drop constraint
) dan operasinya bukan pembangunan kembali penuh (halaman atas b-tree dibuang, halaman daun dibiarkan tidak terhubung dan hasilnya adalah tumpukan) sehingga logika reservasi masih berlaku .Sangat menyenangkan memiliki telinga penulis. :-) Kalen menduga ini hanya penegakan semacam panjang baris minimum, di mana apa pun <9 diisi hingga 9. Tentu saja hanya ada beberapa kasus di mana ini mungkin. Anda akan menemukan byte hantu ini untuk TINYINT dan BIT serta VARCHAR (1) / CHAR (1). Ini tidak akan meningkat melebihi 9 jika Anda pindah ke SMALLINT atau CHAR (2), tetapi itu akan meningkat jika Anda pindah ke, katakanlah, CHAR (3).
Jadi pada dasarnya Anda bisa menunjukkan efisiensi yang bisa Anda peroleh dengan memilih tipe data dengan bijak, tetapi tunjukkan bahwa ada beberapa kasus tepi di mana aturan tidak berlaku karena faktor lain di lapisan penyimpanan.
EDIT Saya berharap memiliki informasi yang lebih nyata untuk Anda. Hanya ingin memberi tahu Anda bahwa inilah yang dipikirkan oleh penulis buku Internal saat ini. Dia tidak 100% yakin.
sumber