Aşağıdaki sorgulardan hangisi daha hızlıdır (LIKE vs CONTAINS)?
SELECT * FROM table WHERE Column LIKE '%test%';
veya
SELECT * FROM table WHERE Contains(Column, "test");
Aşağıdaki sorgulardan hangisi daha hızlıdır (LIKE vs CONTAINS)?
SELECT * FROM table WHERE Column LIKE '%test%';
veya
SELECT * FROM table WHERE Contains(Column, "test");
Yanıtlar:
İkincisi (sizin anlamına gelir CONTAINSve aslında geçerli bir sorguya koymak) daha hızlı olmalıdır, çünkü bazı dizin türleri (bu durumda tam metin dizini) kullanabilir. Tabii ki, sorgunun bu formun yalnızca kullanılabilir eğer sütun tam metin dizini içindedir. Değilse, sadece ilk form kullanılabilir.
LIKE kullanan ilk sorgu, bir joker karakterle başladığı için bir dizin kullanamaz, bu nedenle her zaman tam tablo taraması gerektirir.
CONTAINSSorgu olmalıdır:
SELECT * FROM table WHERE CONTAINS(Column, 'test');
CONTAINSmi? Ne olmuş yani? Sorunun orijinal şekli, Column CONTAIN("%test%",Column)>0geçerli olmayan yere yakındı. Hala tam olarak doğru değil.
SQL Server 2012 örneğinde her iki sorguyu da çalıştırdıktan sonra, ilk sorgunun benim durumumda en hızlı olduğunu onaylayabilirim.
LIKEAnahtar kelimeyle yapılan sorgu, kümelenmiş bir dizin taraması gösterdi.
CONTAINSAyrıca tam metin maç için ek operatörleri ile bir kümelenmiş dizin tarama vardı ve bir birleştirme katılmak.

LIKElider joker ile sorgu verimli indeks bölümünü kullanmak mümkün olmayacaktır. Sadece her şeyi taraması gerekecek. Şüphesiz, tam CI taramasının tam metin dizinini kullanan bir sorgudan daha iyi performans gösterdiği bazı durumlar olabilir (belki de satırların çok yüksek bir oranı eşleşiyorsa), bu, genel olarak onaylayabileceğiniz bazı genel kural değildir " ".
LIKE.
Sorgunuzda bir tire ("-") bulunduğundan bunun CONTAINSdaha uzun sürdüğünü ve kullanıldığını düşünüyorum .Mergeadventure-works.com
Tire bir mola kelimedir böylece CONTAINSiçin tam metin dizini aradı adventureve onu aramış daha works.comve sonuçları birleşti.
Ayrıca şunu değiştirmeyi deneyin:
SELECT * FROM table WHERE Contains(Column, "test") > 0;
Buna:
SELECT * FROM table WHERE Contains(Column, '"*test*"') > 0;
Birincisi " bu bir testtir " ve " bir test senaryosu plan " gibi değerlere sahip kayıtları bulur .
İkincisi ayrıca " bunu test ediyorum " ve " bu en iyisi " gibi değerleri olan kayıtları bulur .
CONTAINSsadece 'test *' gibi önek terimlerini kullanıyor, ' test' gibi sonek terimlerini değil, '* test ' gibi tam alt dize aramasını değil . Yine de denemedim.