Tengo un proceso almacenado que busca productos (250,000 filas) usando un índice de texto completo.¿Por qué las interpretaciones de estas 2 consultas son tan diferentes?
El procedimiento almacenado tiene un parámetro que es la condición de búsqueda de texto completo. Este parámetro puede ser nulo, por lo que agregué una verificación nula y la consulta de repente comenzó a ejecutar órdenes de magnitud más lentas.
-- 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)
Éstos son los planes de ejecución:
consulta # 1
consulta # 2
Debo admitir que no estoy muy familiarizado con los planes de ejecución. La única diferencia obvia para mí es que las uniones son diferentes. Intentaría agregar una pista, pero al no tener unirme a mi consulta, no estoy seguro de cómo hacerlo.
Asimismo, no entiendo muy bien por qué se utiliza el índice denominado IX_SectionID, ya que es un índice que sólo contiene la columna sectionid y que la columna no se utiliza en cualquier lugar.
artículo de Niza - añadiendo opción '(RECOMPILE)' realmente resuelve el problema de rendimiento en la consulta segundo (sin embargo otro problema es que 'CONTIENE()' aumentos un error cuando el parámetro es NULL, pero ese es otro problema). –