Ho problemi con le prestazioni SQL. Per una ragione improvvisa le seguenti domande sono molto lente:Molto lenta query DELETE
Ho due liste che contengono Id di una certa tabella. Ho bisogno di eliminare tutti i record dalla prima lista, se del Id esiste già nella seconda lista:
DECLARE @IdList1 TABLE(Id INT)
DECLARE @IdList2 TABLE(Id INT)
-- Approach 1
DELETE list1
FROM @IdList1 list1
INNER JOIN @IdList2 list2 ON list1.Id = list2.Id
-- Approach 2
DELETE FROM @IdList1
WHERE Id IN (SELECT Id FROM @IdList2)
E 'possibile le due liste contiene più di 10.000 record. In tal caso, entrambe le query richiedono più di 20 secondi per essere eseguite.
Il piano di esecuzione mostrava anche qualcosa che non capisco. Forse questo spiega perché è così lento:
I Ho riempito entrambe le liste con 10.000 numeri interi sequenziali così entrambe le liste contenevano il valore 1-10.000 come punto di partenza.
Come è possibile vedere entrambi i programmi di query per @ IdList2 Numero di righe effettivo è 50.005.000 !!. @ IdList1 è corretto (Numero effettivo di righe è 10.000)
So che ci sono altre soluzioni su come risolvere questo problema. Come riempire una terza lista instabile di rimozione dal primo elenco. Ma la mia domanda è:
Perché queste query di eliminazione sono così lente e perché vedo questi strani piani di query?
Si tratta di un problema che potrebbe verificarsi in uno scenario reale o, solo in questa situazione specilaizzata? – Jodrell
@Jodrell - I problemi sottostanti a nessuna ricompilazione basata sulle statistiche per le variabili di tabella (e la mancanza di indici utili su di essi) è molto comune. –