Mal desempeño plan de consulta después de añadir ORDER BY a texto completo que contengan Buscar
-
16-10-2019 - |
Pregunta
La siguiente consulta está demostrando más allá de mis capacidades para fijar -. Esperanza ayuda alguien puede
SELECT top 100 Id, Name, InsertDate
FROM Foo
WHERE CONTAINS(FooText, '"test*" and "hello*" and "goodbye*"')
ORDER BY InsertDate desc
Sin la cláusula ORDER BY, la realiza la consulta finos (<2 segundos). Pero cuando agrego el ORDER BY, el rendimiento es horrible (> 2 minutos).
El problema parece ser un plan de consulta incorrecta.
El plan de consulta que se realice bien es la siguiente:
El plan de consulta que tiene un pobre rendimiento es la siguiente:
IX_Foo_InsertDate se define como: CREATE CLUSTERED ÍNDICE [IX_Foo_InsertDate] ON [Foo] ([InsertDate] DESC )
¿Cuál es la causa del cambio en los planes de consulta? ¿Cómo puedo solucionarlo?
Solución
El optimizador es elegir el plan diferente, ya que cree que el beneficio de tener el InsertDate
preclasificados (usando IX_Foo_InsertDate
) mayor que el costo una vez que añadir la cláusula order by
.
El optimizador no puede ser perfecto, puede elegir un camino más lento, incluso si las estadísticas son correctas - pero sin duda toman malas decisiones si las estadísticas no son exactos - son AUTO_CREATE_STATISTICS y AUTO_UPDATE_STATISTICS en
Si es necesario, podría ser capaz de 'truco' el optimizador de la siguiente manera:
SELECT top 100 Id, Name, InsertDate
FROM Foo
WHERE CONTAINS(FooText, '"test*" and "hello*" and "goodbye*"')
ORDER BY some_function_of(InsertDate) desc
donde some_function_of(InsertDate)
tiene el mismo orden que InsertDate