Yang mana dari pertanyaan berikut yang lebih cepat (LIKE vs CONTAIN)?
SELECT * FROM table WHERE Column LIKE '%test%';
atau
SELECT * FROM table WHERE Contains(Column, "test");
Yang mana dari pertanyaan berikut yang lebih cepat (LIKE vs CONTAIN)?
SELECT * FROM table WHERE Column LIKE '%test%';
atau
SELECT * FROM table WHERE Contains(Column, "test");
Jawaban:
Yang kedua (dengan asumsi Anda berarti CONTAINS
, dan benar-benar memasukkannya ke dalam kueri yang valid) harus lebih cepat, karena dapat menggunakan beberapa bentuk indeks (dalam hal ini, indeks teks lengkap). Tentu saja, bentuk kueri ini hanya tersedia jika kolom dalam indeks teks lengkap. Jika tidak, maka hanya formulir pertama yang tersedia.
Kueri pertama, menggunakan LIKE, tidak akan dapat menggunakan indeks, karena dimulai dengan wildcard, jadi akan selalu memerlukan pemindaian tabel penuh.
The CONTAINS
permintaan harus:
SELECT * FROM table WHERE CONTAINS(Column, 'test');
CONTAINS
? Apa itu? Bentuk asli dari pertanyaan tersebut Column CONTAIN("%test%",Column)>0
adalah mana yang hampir tidak valid. Itu masih belum sepenuhnya benar.
Setelah menjalankan kedua kueri pada contoh SQL Server 2012, saya dapat mengonfirmasi permintaan pertama tercepat dalam kasus saya.
Kueri dengan LIKE
kata kunci menunjukkan pemindaian indeks berkerumun.
The CONTAINS
juga memiliki indeks scan berkerumun dengan operator tambahan untuk pertandingan teks lengkap dan gabungan bergabung.
LIKE
query dengan wildcard terkemuka tidak akan dapat menggunakan bagian indeks efisien. Ini perlu memindai semuanya. Meskipun tidak diragukan lagi mungkin ada beberapa keadaan di mana pemindaian CI lengkap berkinerja lebih baik daripada permintaan menggunakan indeks teks lengkap (mungkin jika proporsi baris yang sangat tinggi cocok misalnya), ini sebagian besar akan menjadi pengecualian, bukan aturan umum yang Anda "bisa konfirmasi ".
LIKE
.
Saya pikir itu CONTAINS
membutuhkan waktu lebih lama dan digunakan Merge
karena Anda memiliki tanda hubung ("-") dalam permintaan Andaadventure-works.com
.
Tanda hubung adalah kata istirahat sehingga CONTAINS
pencarian indeks teks lengkap untuk adventure
dan daripada mencari works.com
dan menggabungkan hasilnya.
Coba juga ubah dari ini:
SELECT * FROM table WHERE Contains(Column, "test") > 0;
Untuk ini:
SELECT * FROM table WHERE Contains(Column, '"*test*"') > 0;
Yang pertama akan menemukan catatan dengan nilai-nilai seperti " ini adalah tes " dan " kasus uji adalah rencananya ".
Yang terakhir juga akan menemukan catatan dengan nilai-nilai seperti " saya menguji ini " dan " ini adalah yang terbesar ".
CONTAINS
, itu hanya menyebutkan menggunakan istilah awalan seperti 'test *', bukan akhiran istilah seperti ' test' dan bukan pencarian substring penuh seperti '* test '. Saya belum mencobanya.