Tengo una tabla con aproximadamente 1 millón de registros (ejecutando SQL Server 2008 Web). Tengo una rutina de búsqueda que intenta hacer coincidir el código del producto y la descripción del producto. Sin embargo, en algunas circunstancias es muy lento. A continuación se muestra (corte hacia abajo) instrucción SQL:¿Por qué esta declaración de SQL es muy lenta?
WITH AllProducts AS (
SELECT p.*, Row_Number() OVER (ORDER BY ProductId) AS RowNumber
FROM Product AS p
WHERE p.IsEnabled=1 AND
(
p.BaseSku = 'KPK-3020QWC-C' -- this on its own is fast
OR
CONTAINS(p.FreeTextStrings, '"KPK-3020QWC*"') -- and this on its own is fast, but not both
)
) SELECT * FROM AllProducts
WHERE RowNumber BETWEEN 1 AND 20;
Tenga en cuenta que si sólo se compara en [p.BaseSku = 'KPK-3020QWC-C'] o [CONTIENE (p.FreeTextStrings '", KPK-3020QWC * "')] individualmente (pero no ambos) es instantáneo. Y si los comparo juntos, lleva años (varios minutos) y devuelve solo una fila.
IsEnabled y BaseSku están indexados, y FreeTextStrings está indexado en FTS.
Recuerdo que esto funcionaba bien antes.
¿Alguien puede arrojar algo de luz sobre esto y sugerir algunas soluciones?
archivo de plan de ejecución está disponible aquí: http://wiki.webgear.co.nz/GetFile.aspx?File=Temp%5cSearch%20Test.sqlplan.zip
¿Puede mostrarnos un plan de ejecución de su servidor SQL? –
Estos problemas comenzaron a ocurrir después de actualizar SQL 2005 a SQL 2008. – Muxa