none
Piani di esecuzione multipli RRS feed

  • Domanda

  • Ciao a tutti,

    vorrei un consiglio su come affrontare il caso in cui l'interrogazione di una stored procedure (contenente funzioni tabellari) via SSMS impiega circa 4-6 secondi mentre via "web" (quindi forse altro provider/driver) generi un tempo di esecuzione molto maggiore di oltre 30 secondi.

    Abbiamo provato a rifare l'ALTER della funzione tabellare e questo può sistemare solo "momentaneamente" le differenze. 

    Alla fine Abbiamo messo una pezza aggiungendo "with recompile" alla stored procedure e in questo modo la situazione si è uniformata.

    Avrei bisogno di individuare, tramite query "sys." ai piani di esecuzione, una la situazione simile in cui il database usa differenti piani di esecuzione e qual è il sistema corretto per correggere il problema.

    Grazie a tutti

    Saluti


    giovedì 10 febbraio 2022 09:21

Risposte


  • Le funzioni tabellari sono prive di statistiche e quindi i piani di esecuzione che le coinvolgono difficilmente risultano ottimi.

    Visti i tempi di esecuzione che riporti, potrebbe essere percorribile la strada che consiste nel persistere i suoi dati in una temp table, crearvi un indice opportuno e usarla in luogo della funzione.

    Sempre che il problema non sia altrove: sarebbe utile vedere il codice della stored in questione.

    ciao

    Giorgio


    venerdì 11 febbraio 2022 05:07

Tutte le risposte


  • Le funzioni tabellari sono prive di statistiche e quindi i piani di esecuzione che le coinvolgono difficilmente risultano ottimi.

    Visti i tempi di esecuzione che riporti, potrebbe essere percorribile la strada che consiste nel persistere i suoi dati in una temp table, crearvi un indice opportuno e usarla in luogo della funzione.

    Sempre che il problema non sia altrove: sarebbe utile vedere il codice della stored in questione.

    ciao

    Giorgio


    venerdì 11 febbraio 2022 05:07
  • Ciao,

    il with(recompile) non risolve il problema, fa cambiare il piano di esecuzione per un certo periodo di tempo. Però dopo qualche azione che ancora non ho capito (ricostruzione indici, backup, statistiche etc) ritorna tutto come prima.

    Per questo nella funzione ho inserito delle tabelle temporanee @tab che permettono la costruzione di una query in cui le tabelle sono "minime" e per cui non sono più possibili errori legati al motore di esecuzione/indici.

    Ciao

    lunedì 7 marzo 2022 11:35