Saya tahu bahwa ketika VARCHAR(MAX)/NVARCHAR(MAX)
kolom digunakan data disimpan out of the row
- baris data akan memiliki pointer ke lokasi lain di mana 'nilai besar' disimpan.
Saya punya pertanyaan berikut:
- Apakah setiap bidang disimpan
out of the row
atau hanya bidangmax
? - Jika Anda menggunakan
clustered index
tabel untuk membaca seluruh catatan, apakah bidang yang disimpan di luar baris juga dibaca?
VARCHAR (MAX) atau NVARCHAR (MAX) dianggap sebagai 'tipe nilai besar'. Jenis nilai besar biasanya disimpan 'di luar baris'. Itu berarti ...
Jawaban:
Sebenarnya, itu tergantung pada pengaturan
large value types out of row
opsi, yang dapat diatur menggunakansp_tableoption
. Dari dokumentasi :The standar adalah untuk
MAX
nilai yang akan disimpan di baris , hingga 8000 byte, jika mereka cocok. Kecuali jika Anda telah terbiasasp_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 denganMAX
tipe, karena SQL Server harus siap untuk menangani data yang mungkin berukuran hingga 2GB.Hanya
MAX
yang. Selain itu, jikaMAX
kolom sebelumnya dalam baris dipindahkan dari baris, hanya kolom di baris itu yang terpengaruh. Itu diganti in-row oleh pointer ke struktur off-rowLOB
. Ada juga keadaan di mana kolom non-MAX dapat dipindahkan secara off-row.Memindai indeks yang dikelompokkan hanya melintasi data dalam baris. Jika data off-row diperlukan untuk query, itu dicari menggunakan pointer in-row.
sumber
Scanning the clustered index traverses only in-row data.
? Misalnya, jika Anda ingin menampilkan nilaiNVARCHAR(MAX)
bidang, bagaimana mungkin hanya bekerja denganin-row-data
(jika nilai disimpan di luar baris)? Atau ketika Anda menggunakan indeks berkerumun (karena tidak ada indeks penutup) tetapi Anda tidak akanwork
denganNVARCHAR(MAX)
bidang SQL Server cukup pintar untuk melihat itu dan melewatkan mencariout-of-row
data?int
dannvarchar(max)
dan Anda memilih hanyaint
kolom, SQL-Server tidak menyia-nyiakan sumber daya untukread
ituout-of-row
data seperti tahu Anda tidak akan menggunakannya?sp_tableoption
Anda dapat mengeluarkan semua tabel yang tidak sering digunakan untuk mengurangi ukuran baris, ketika banyak indeks berkerumun mencari / memindai dibuat.text
,ntext
danimage
. Anda juga bisa menyimpan tipe besar dalam tabel terpisah, tentu saja.Perilaku ini untuk penyimpanan objek besar dapat dikontrol oleh pengaturan tabel:
exec sp_tableoption N'MyTable', 'large value types out of row', <'ON' or 'OFF'>
Referensi dalam dokumentasi SQL Server 2012 ada di: http://msdn.microsoft.com/en-us/library/ms173530.aspx
Oleh karena itu Anda dapat mengontrol di mana ruang digunakan, in-row atau disimpan di luar baris.
sumber