Ho una procedura memorizzata abbastanza complessa (o brutta a seconda di come la si guarda) in esecuzione su SQL Server 2008. Basa gran parte della logica su una vista che ha una tabella pk e una tabella fk. La tabella fk viene lasciata unita alla tabella pk leggermente più di 30 volte (la tabella fk ha un design scarso - utilizza coppie di valori nome che devo appiattire. Sfortunatamente, è di terze parti e non posso cambiarlo).La generazione del piano di query SQL richiede 5 minuti, la query viene eseguita in millisecondi. Che cosa succede?
In ogni caso, funzionava bene da settimane fino a quando non ho notato periodicamente una corsa che richiedeva 3-5 minuti. Si scopre che questo è il tempo necessario per generare il piano di query. Una volta che il piano di query esiste e viene memorizzato nella cache, la stored procedure stessa viene eseguita in modo molto efficiente. Le cose funzionano senza problemi finché non c'è un motivo per rigenerare e memorizzare nuovamente il piano di query nella cache.
Qualcuno ha visto questo? Perché ci vuole così tanto tempo per generare il piano? Ci sono modi per farlo venire con un piano più veloce?
Anche questo vale la pena. Anche se ho provato PIVOT e alcuni CTE e finora la sinistra si unisce come una vista è stata la più efficiente. Hai visto in questo modo essere più veloce prima? – TheEmirOfGroofunkistan
Sì. Ho avuto la stessa logica (più (circa 20) left-join di "fk-table" in una "master-table"), e il tempo di esecuzione è aumentato drasticamente dopo aver aggiunto un altro join della stessa tabella. Riscrivere l'aggiornamento "gigante" con selezione a due passaggi ha davvero aiutato. Ma forse era solo un caso particolare di indici sfortunati, non sono andato a scavare. (E scusa, mancata "su una vista" nel tuo post) –
np - la vista semplifica il riutilizzo della query, non sono sicuro che sia necessario. – TheEmirOfGroofunkistan