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 CONTAINS
ve 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.
CONTAINS
Sorgu olmalıdır:
SELECT * FROM table WHERE CONTAINS(Column, 'test');
CONTAINS
mi? Ne olmuş yani? Sorunun orijinal şekli, Column CONTAIN("%test%",Column)>0
geç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.
LIKE
Anahtar kelimeyle yapılan sorgu, kümelenmiş bir dizin taraması gösterdi.
CONTAINS
Ayrıca tam metin maç için ek operatörleri ile bir kümelenmiş dizin tarama vardı ve bir birleştirme katılmak.
LIKE
lider 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 CONTAINS
daha uzun sürdüğünü ve kullanıldığını düşünüyorum .Merge
adventure-works.com
Tire bir mola kelimedir böylece CONTAINS
için tam metin dizini aradı adventure
ve onu aramış daha works.com
ve 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 .
CONTAINS
sadece 'test *' gibi önek terimlerini kullanıyor, ' test' gibi sonek terimlerini değil, '* test ' gibi tam alt dize aramasını değil . Yine de denemedim.