it-swarm.asia

Menggunakan varchar (MAX) vs TEXT di SQL Server

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

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

  1. Menggunakan klausa LIKE terhadap kolom VARCHAR(MAX)?

    WHERE COL1 LIKE '%search string%'

  2. Menggunakan kolom TEXT dan meletakkan Indeks Teks Lengkap/Katalog pada kolom ini, dan kemudian mencari menggunakan klausa CONTAINS?

    WHERE CONTAINS (Col1, 'MyToken')

184
user85116

Tipe VARCHAR(MAX) adalah pengganti TEXT. Perbedaan mendasar adalah bahwa tipe TEXT akan selalu menyimpan data dalam gumpalan sedangkan tipe VARCHAR(MAX) akan mencoba untuk menyimpan data secara langsung dalam baris kecuali jika melebihi batas 8k dan pada saat itu menyimpannya dalam gumpalan.

Menggunakan pernyataan LIKE adalah identik antara kedua tipe data. Fungsi tambahan VARCHAR(MAX) memberi Anda adalah bahwa itu juga dapat digunakan dengan = dan GROUP BY seperti kolom VARCHAR 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 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 sering cocok untuk sejumlah kecil data, tetapi memiliki kinerja yang sangat buruk dengan data besar karena ketidakmampuannya untuk menggunakan indeks.

298
Robin Day

Untuk teks besar, indeks teks lengkap adalah banyak lebih cepat. Tapi Anda bisa indeks teks lengkapvarchar(max)as juga.

17
Joel Coehoorn

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, LIKE masih berfungsi, mis.

where a like '%a%'
15
DForck42
  • Definisi Dasar

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

  • Yang mana yang akan Digunakan?

Per 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 kolom tipe Text 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 kolom tipe Varchar(max) 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-Row Varchar (Max) bagus untuk pencarian dan pengambilan.

  • Fungsi yang Didukung/Tidak Didukung

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

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

    • Sistem IO Pertimbangan

Seperti yang kita ketahui bahwa nilai kolom tipe VarChar (Max) disimpan di luar baris hanya jika panjang nilai yang akan disimpan di dalamnya lebih besar dari 8000 byte atau tidak ada cukup ruang di baris, jika tidak maka akan disimpan 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 jenis 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 TEXT untuk kinerja yang baik.

Sumber

8
Somnath Muluk

Jika menggunakan MS Access (terutama versi yang lebih tua seperti 2003) Anda terpaksa menggunakan datatype TEXT pada SQL Server karena MS Access tidak mengenali nvarchar(MAX) sebagai bidang Memo dalam Access, sedangkan TEXT dikenali sebagai Memo- bidang.

4