Percayai pengoptimal.
Tulis kueri yang paling sederhana mengungkapkan apa yang ingin Anda capai. Jika Anda mengalami masalah kinerja dengan kueri itu, maka Anda harus melihat apakah ada indeks yang hilang. Tapi Anda tetap tidak harus secara eksplisit bekerja dengan indeks ini.
Jangan khawatirkan diri Anda dengan pertimbangan tentang bagaimana Anda mungkin menerapkan penelusuran semacam itu.
Dalam sangat keadaan langka, Anda mungkin perlu memaksa kueri lebih lanjut untuk menggunakan indeks tertentu (melalui petunjuk), tetapi ini mungkin <0,1% kueri.
Dalam paket yang Anda posting, versi "dioptimalkan" Anda menyebabkan pemindaian terhadap 2 indeks tabel Params (saya kira) Anda (PK_Params_1, IX_Params_1). Tanpa melihat kueri, sulit untuk mengetahui mengapa ini terjadi, tetapi jika Anda membandingkan dengan pemindaian tunggal terhadap tabel ("Brute force") dan dua, mudah untuk melihat mengapa yang kedua tidak lebih efisien.
Saya pikir saya akan mencoba:
SELECT p.ProductID, ptr.[Rank]
FROM dbo.SearchItemsGet(@SearchID, NULL) AS si
JOIN dbo.ProductDefs AS pd
ON pd.ParamTypeID = si.ParamTypeID
JOIN dbo.Params AS p
ON p.ProductDefID = pd.ProductDefID
JOIN dbo.ProductTypesResultsGet(@SearchID) AS ptr
ON ptr.ProductTypeID = pd.ProductTypeID
LEFT JOIN Params p_anti
on p_anti.ProductDefId = pd.ProductDefID and
(p_anti.ParamLo < si.LowMin or p_anti.ParamHi > si.HiMax)
WHERE si.Mode IN (1, 2)
AND p_anti.ProductID is null
GROUP BY p.ProductID, ptr.[Rank]
Yaitu. memperkenalkan anti-gabung yang menghilangkan hasil yang tidak Anda inginkan.