Saya baru saja membaca bahwa VARCHAR(MAX)
datatype (yang dapat menyimpan hampir 2GB data char) adalah pengganti yang direkomendasikan untuk TEXT
datatype dalam versi SQL Server 2005 dan SQL Server selanjutnya.
Jika saya ingin mencari di dalam kolom untuk string, operasi mana yang lebih cepat?
Menggunakan
LIKE
klausa terhadapVARCHAR(MAX)
kolom?WHERE COL1 LIKE '%search string%'
Menggunakan
TEXT
kolom dan meletakkan Indeks Teks Lengkap / Katalog pada kolom ini, dan kemudian mencari menggunakanCONTAINS
klausa?WHERE CONTAINS (Col1, 'MyToken')
sql-server
performance
text
varchar
sql-types
pengguna85116
sumber
sumber
TEXT
danNTEXT
(danIMAGE
) sudah usang.Jawaban:
The
VARCHAR(MAX)
jenis adalah penggantiTEXT
. Perbedaan mendasar adalah bahwa suatuTEXT
tipe akan selalu menyimpan data dalam gumpalan sedangkanVARCHAR(MAX)
tipe akan berusaha untuk menyimpan data secara langsung di baris kecuali melebihi batas 8k dan pada saat itu menyimpannya dalam gumpalan.Menggunakan pernyataan LIKE identik antara dua tipe data. Fungsi tambahan
VARCHAR(MAX)
memberi Anda adalah bahwa itu juga dapat digunakan dengan=
danGROUP BY
sepertiVARCHAR
kolom lainnya . Namun, jika Anda memiliki banyak data, Anda akan memiliki masalah kinerja yang sangat besar menggunakan metode ini.Sehubungan dengan apakah Anda harus menggunakan
LIKE
untuk mencari, atau jika Anda harus menggunakan Pengindeksan Teks Lengkap danCONTAINS
. Pertanyaan ini sama terlepas dariVARCHAR(MAX)
atauTEXT
.Jika Anda mencari sejumlah besar teks dan kinerja adalah kunci maka Anda harus menggunakan Indeks Teks Lengkap .
LIKE
lebih sederhana untuk diimplementasikan dan seringkali cocok untuk sejumlah kecil data, tetapi memiliki kinerja yang sangat buruk dengan data besar karena ketidakmampuannya untuk menggunakan indeks.sumber
Untuk teks besar, indeks teks lengkap adalah jauh lebih cepat. Tapi Anda bisa indeks teks lengkap
varchar(max)
juga.sumber
Anda tidak dapat mencari bidang teks tanpa mengubahnya dari teks ke varchar.
Ini memberikan kesalahan:
Apakah ini tidak:
Menariknya,
LIKE
masih berfungsi, yaitusumber
varchar(n)
atautext
, dan melupakan jawaban ini. Apakah Anda berpikir, di lingkungan profesional, bahwa berdebat dengan pernyataan yang tidak jelas akan membantu menyelesaikan masalah? Semua posting di StackOverflow dimaksudkan untuk dilihat oleh ribuan orang, bertindaklah sebagai konsekuensi!TEXT
danVarChar(MAX)
tipe data karakter Panjang Variabel Panjang Non-Unicode, yang dapat menyimpan maksimum 2147483647 karakter Non-Unicode (yaitu kapasitas penyimpanan maksimum adalah: 2GB).Sesuai tautan MSDN, Microsoft menyarankan untuk tidak menggunakan datatype Teks dan itu akan dihapus dalam versi Sql Server yang akan datang. Varchar (Max) adalah tipe data yang disarankan untuk menyimpan nilai string besar, bukan tipe data teks.
Data
Text
kolom tipe disimpan di luar baris dalam halaman data LOB yang terpisah. Baris di halaman data tabel hanya akan memiliki pointer 16 byte ke halaman data LOB di mana data aktual hadir. Sedangkan Data dariVarchar(max)
kolom tipe disimpan dalam baris jika kurang dari atau sama dengan 8000 byte. Jika nilai kolom Varchar (max) melewati 8000 byte, maka nilai kolom Varchar (max) disimpan dalam halaman data LOB terpisah dan baris hanya akan memiliki pointer 16 byte ke halaman data LOB di mana data aktual hadir. JadiIn-Row
Varchar (Max) baik untuk pencarian dan pengambilan.Beberapa fungsi string, operator atau konstruksi yang tidak berfungsi pada kolom Jenis teks, tetapi mereka bekerja pada kolom tipe VarChar (Max).
=
Setara dengan Operator pada kolom tipe VarChar (Max)Kelompokkan dengan klausa pada kolom tipe VarChar (Max)
Seperti yang kita ketahui bahwa nilai kolom tipe VarChar (Max) disimpan di luar baris hanya jika panjang nilai yang akan disimpan di dalamnya lebih dari 8000 byte atau tidak ada cukup ruang di baris, jika tidak maka akan menyimpan itu berturut-turut. Jadi jika sebagian besar nilai yang disimpan di kolom VarChar (Max) berukuran besar dan disimpan di luar baris, perilaku pengambilan data akan hampir mirip dengan yang ada di kolom tipe Teks.
Tetapi jika sebagian besar nilai yang disimpan di kolom tipe VarChar (Max) cukup kecil untuk disimpan di baris. Kemudian pengambilan data di mana kolom LOB tidak termasuk memerlukan lebih banyak jumlah halaman data untuk dibaca karena nilai kolom LOB disimpan dalam baris di halaman data yang sama di mana nilai-nilai kolom non-LOB disimpan. Tetapi jika kueri pemilihan menyertakan kolom LOB maka itu membutuhkan lebih sedikit jumlah halaman untuk dibaca untuk pengambilan data dibandingkan dengan kolom tipe Teks.
Kesimpulan
Gunakan
VarChar(MAX)
tipe data daripadaTEXT
untuk kinerja yang baik.Sumber
sumber
Jika menggunakan MS Access (terutama versi yang lebih lama seperti 2003) Anda terpaksa menggunakan
TEXT
tipe data pada SQL Server karena MS Access tidak mengenalinvarchar(MAX)
sebagai bidang Memo di Access, sedangkanTEXT
diakui sebagai bidang-Memo.sumber