Menggunakan varchar (MAX) vs TEXT di SQL Server

195

Saya baru saja membaca bahwa VARCHAR(MAX)datatype (yang dapat menyimpan hampir 2GB data char) adalah pengganti yang direkomendasikan untuk TEXTdatatype dalam versi SQL Server 2005 dan SQL Server selanjutnya.

Jika saya ingin mencari di dalam kolom untuk string, operasi mana yang lebih cepat?

  1. Menggunakan LIKEklausa terhadap VARCHAR(MAX)kolom?

    WHERE COL1 LIKE '%search string%'

  2. Menggunakan TEXTkolom dan meletakkan Indeks Teks Lengkap / Katalog pada kolom ini, dan kemudian mencari menggunakan CONTAINSklausa?

    WHERE CONTAINS (Col1, 'MyToken')

pengguna85116
sumber
1
Posting ini juga membantu: stackoverflow.com/questions/564755/…
Jake
24
Disebutkan paling penting dalam posting itu adalah tautan ke dokumentasi MSDN yang menunjukkan bahwa TEXTdan NTEXT(dan IMAGE) sudah usang.
Brian
Lihatlah tautan: stackoverflow.com/q/28980502/1805776
vicky

Jawaban:

315

The VARCHAR(MAX)jenis adalah pengganti TEXT. Perbedaan mendasar adalah bahwa suatu TEXTtipe akan selalu menyimpan data dalam gumpalan sedangkan VARCHAR(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 =dan GROUP BYseperti VARCHARkolom lainnya . Namun, jika Anda memiliki banyak data, Anda akan memiliki masalah kinerja yang sangat besar menggunakan metode ini.

Sehubungan dengan apakah Anda harus menggunakan LIKEuntuk mencari, atau jika Anda harus menggunakan Pengindeksan Teks Lengkap dan CONTAINS. Pertanyaan ini sama terlepas dari VARCHAR(MAX)atau TEXT.

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.

Robin Day
sumber
12
Saya tidak tahu bahwa itu akan disimpan di halaman di 8k, dan keluar dari halaman jika lebih besar. Sangat keren.
Brain2000
3
Baris terakhir Anda sebagian salah. LIKE tidak bisa menggunakan index ONLY jika wildcard ada di awal string yang dicari.
SouravA
1
Apakah tidak ada masalah untuk mengubah bidang dari teks ke varchar (maks) dari tabel yang ada dengan data?
user1531040
17

Untuk teks besar, indeks teks lengkap adalah jauh lebih cepat. Tapi Anda bisa indeks teks lengkap varchar(max) juga.

Joel Coehoorn
sumber
16

Anda tidak dapat mencari bidang teks tanpa mengubahnya dari teks ke varchar.

declare @table table (a text)
insert into @table values ('a')
insert into @table values ('a')
insert into @table values ('b')
insert into @table values ('c')
insert into @table values ('d')


select *
from @table
where a ='a'

Ini memberikan kesalahan:

The data types text and varchar are incompatible in the equal to operator.

Apakah ini tidak:

declare @table table (a varchar(max))

Menariknya, LIKEmasih berfungsi, yaitu

where a like '%a%'
DForck42
sumber
11
+1 hanya untuk mengatakan downvote acak! Membuat saya gila ketika orang-orang menurunkan saya dan tidak memiliki komentar, mereka benar-benar perlu mendapatkan kehidupan.
Tom Stickel
3
Alasan dia mendapatkan suara turun adalah bahwa dari apa yang saya ingat dari hal-hal yang harus saya lakukan bukanlah argumen yang valid untuk menjawab ketika menjawab pertanyaan teknis. Pikirkan tentang orang-orang (seperti saya sekarang) yang mencoba mencari tahu mengapa kita harus menggunakan varchar(n)atau text, 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!
Anwar
3
@Zeratops lol, jawaban ini adalah 6 tahun, saya agak hijau jadi ketika saya menulisnya. saya membersihkan kata-katanya agar lebih tepat sasaran.
DForck42
9
  • Definisi Dasar

TEXTdan VarChar(MAX)tipe data karakter Panjang Variabel Panjang Non-Unicode, yang dapat menyimpan maksimum 2147483647 karakter Non-Unicode (yaitu kapasitas penyimpanan maksimum adalah: 2GB).

  • Yang mana yang akan digunakan?

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.

  • Penyimpanan In-Row atau Out-of-Row

Data Textkolom 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 dari Varchar(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. Jadi In-RowVarchar (Max) baik untuk pencarian dan pengambilan.

  • Fungsi yang Didukung / Tidak Didukung

Beberapa fungsi string, operator atau konstruksi yang tidak berfungsi pada kolom Jenis teks, tetapi mereka bekerja pada kolom tipe VarChar (Max).

  1. = Setara dengan Operator pada kolom tipe VarChar (Max)
  2. Kelompokkan dengan klausa pada kolom tipe VarChar (Max)

    • Pertimbangan Sistem IO

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 daripada TEXTuntuk kinerja yang baik.

Sumber

Somnath Muluk
sumber
5

Jika menggunakan MS Access (terutama versi yang lebih lama seperti 2003) Anda terpaksa menggunakan TEXTtipe data pada SQL Server karena MS Access tidak mengenali nvarchar(MAX)sebagai bidang Memo di Access, sedangkan TEXTdiakui sebagai bidang-Memo.

Klaus Oberdalhoff
sumber