Badly eseguendo piano di query dopo l'aggiunta di ORDER BY al testo completo contiene Visualizza

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

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: entrare descrizione dell'immagine qui

Il piano di query che esegue male è questo: entrare descrizione dell'immagine qui

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?

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a dba.stackexchange
scroll top