Mal desempeño plan de consulta después de añadir ORDER BY a texto completo que contengan Buscar

dba.stackexchange https://dba.stackexchange.com/questions/2966

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: introducir descripción de la imagen aquí

El plan de consulta que tiene un pobre rendimiento es la siguiente: introducir descripción de la imagen aquí

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?

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a dba.stackexchange
scroll top