Tam metin dizini kullanarak ürünleri (250.000 satır) arayan bir depolanmış procum var.Bu 2 sorgunun performansı neden bu kadar farklı?
Kaydedilen prok, tam metin arama koşulu olan bir parametre alır. Bu parametre boş olabilir, bu yüzden null bir kontrol ekledim ve sorgu aniden büyüklük sıralarını daha yavaş çalıştırmaya başladı.
Sorgu # 1
Sorgu # 2
ben yürütme planları ile çok aşina değilim itiraf gerekir:
-- This is normally a parameter of my stored proc
DECLARE @Filter VARCHAR(100)
SET @Filter = 'FORMSOF(INFLECTIONAL, robe)'
-- #1 - Runs < 1 sec
SELECT TOP 100 ID FROM dbo.Products
WHERE CONTAINS(Name, @Filter)
-- #2 - Runs in 18 secs
SELECT TOP 100 ID FROM dbo.Products
WHERE @Filter IS NULL OR CONTAINS(Name, @Filter)
İşte yürütme planları vardır. Benim için tek açık fark, birleşmelerin farklı olmasıdır. Bir ipucu eklemeye çalışıyorum ama sorgumda bir katılma olmamasını nasıl yapacağımı bilmiyorum.
Ayrıca IX_SectionID adlı dizinin neden kullanıldığını tam olarak anlayamıyorum, çünkü yalnızca SectionID sütununu içeren bir dizin ve bu sütun hiçbir yerde kullanılmıyor.
Güzel makale - SEÇENEĞİ (RECOMPILE) 'ekleyerek' aslında 2 sorguya performans sorununu (giderir ancak başka bir sorun '()' zam CONTAINS olmasıdır Parametre NULL olduğunda bir hata, ancak başka bir sorun). –