Intenté una posible solución. Antes de esta solución, incluso la consulta no devolvía el resultado y causaba un error de tiempo de espera de conexión.
Mi consulta tenía un filtro de fecha y otros criterios.Todos los otros criterios fueron como búsqueda. Una palabra clave de columna estaba buscando como '% abc%' en la columna ntext y estaba haciendo un escaneo completo de la tabla.
Solución:
Dividir consulta en 2 partes. 1) Primera parte en CTE (Common Table Express) 2) Aplicar todos los criterios de búsqueda en CTE.
WITH SearchData(Column1,Column2,Column3,Column4,........)
AS
(
SELECT Column1,Column2,Column3,Column4,...........
FROM myTable1 WITH(NOLOCK)
INNER JOIN MyTable2 WITH(NOLOCK)
ON MyTable1.id = MyTable2.Id
WHERE (MyTable1.CreationTime >= '2014-04-27' AND MyTable1.CreationTime <= '2014-05-01')
)
SELECT DISTINCT top 250 Column1,Column2,Column3,Column4
FROM SearchData
WHERE (ISNULL(Column1,'') LIKE @Column1 +'%' OR @Column1 IS NULL)
and (Column2 LIKE @Column2+ '%' OR @Column2 IS NULL)
...
...
...
...
AND (Column10 like '%'[email protected]+'%' or @Column10 IS NULL)
AND @[email protected][email protected][email protected] <> ''
ORDER BY [CreationTime] DESC
Me funcionó.
puedes use un índice, con un poco de trabajo, cuando haga LIKE '%' + cadena, vea el enlace en mi otro comentario. –
@KM: truco interesante, una columna invertida. También una buena analogía con la guía telefónica, hace que el caso sea vívidamente claro. –
buen truco, obad no hay nada similar para el problema '% text%'. – HLGEM