Saya tahu bahwa ketika VARCHAR(MAX)/NVARCHAR(MAX)
kolom digunakan, data disimpan di luar baris ...
Sebenarnya, itu tergantung pada pengaturan large value types out of row
opsi, yang dapat diatur menggunakan sp_tableoption
. Dari dokumentasi :
The standar adalah untuk MAX
nilai yang akan disimpan di baris , hingga 8000 byte, jika mereka cocok. Kecuali jika Anda telah terbiasa sp_tableoption
mengubah default, MAX
data Anda kemungkinan besar akan disimpan dalam baris.
Yang mengatakan, itu adalah praktik yang buruk untuk menggunakan MAX
tipe data untuk nilai yang tidak akan pernah melebihi 8000 byte - sebagai gantinya gunakan tipe non-MAX. Selain dari yang lain, kinerja seringkali jauh lebih buruk ketika berhadapan dengan MAX
tipe, karena SQL Server harus siap untuk menangani data yang mungkin berukuran hingga 2GB.
Apakah setiap bidang disimpan di luar baris atau hanya yang maks?
Hanya MAX
yang. Selain itu, jika MAX
kolom sebelumnya dalam baris dipindahkan dari baris, hanya kolom di baris itu yang terpengaruh. Itu diganti in-row oleh pointer ke struktur off-row LOB
. Ada juga keadaan di mana kolom non-MAX dapat dipindahkan secara off-row.
Jika Anda menggunakan indeks berkerumun tabel untuk membaca seluruh catatan, apakah bidang yang disimpan di luar baris juga dibaca?
Memindai indeks yang dikelompokkan hanya melintasi data dalam baris. Jika data off-row diperlukan untuk query, itu dicari menggunakan pointer in-row.