Badly eseguendo piano di query dopo l'aggiunta di ORDER BY al testo completo contiene Visualizza
-
16-10-2019 - |
Domanda
La query seguente si sta rivelando al di là delle mie capacità di correzione -. La speranza che qualcuno possa aiutare
SELECT top 100 Id, Name, InsertDate
FROM Foo
WHERE CONTAINS(FooText, '"test*" and "hello*" and "goodbye*"')
ORDER BY InsertDate desc
Senza la clausola ORDER BY, l'esegue interrogazioni sottili (<2 secondi). Ma quando aggiungo ORDER BY, la prestazione è terribile (> 2 minuti).
Il problema sembra essere un piano di query non corretta.
Il piano di query che si comporta bene è questo:
Il piano di query che esegue male è questo:
IX_Foo_InsertDate è definito come: CREATE Clustered Index [IX_Foo_InsertDate] ON [Foo] ([InsertDate] DISC )
Qual è la causa del cambiamento di piani di query? Come posso risolvere il problema?
Soluzione
L'ottimizzatore è la scelta del piano di diverso perché pensa il vantaggio di avere il InsertDate
pre-ordinato (utilizzando IX_Foo_InsertDate
) supera il costo una volta che si aggiunge la clausola order by
.
L'ottimizzatore non può essere perfetto, si potrebbe scegliere un percorso più lento, anche se le statistiche sono accurate - ma sarà certamente fare scelte sbagliate se le statistiche non sono precisi -? Sono AUTO_CREATE_STATISTICS e AUTO_UPDATE_STATISTICS su
Se necessario, si potrebbe essere in grado di 'trucco' l'ottimizzatore in questo modo:
SELECT top 100 Id, Name, InsertDate
FROM Foo
WHERE CONTAINS(FooText, '"test*" and "hello*" and "goodbye*"')
ORDER BY some_function_of(InsertDate) desc
dove some_function_of(InsertDate)
ha lo stesso ordine InsertDate