none
[SQL SERVER] Ottimizzare stored procedure che legge da tabelle tramite linked server e fa la insert RRS feed

  • Domanda

  • Ciao a tutti,

    vorrei ottimizzare una sp della quale vi descrivo il funzionamento e l'obiettivo.

    La SP serve trasferire il contenuto delle tabelle di alcuni database presenti su dei server remoti, in un unica tabella su un database locale.

    La SP viene invocata dall'istanza SQL Server di destinazione, ovvero dove verrà scritto il contenuto delle tabelle remote.

    Tramite un cursore si scorrono tutti i database che hanno un nome specifico sui linked server e si legge il contenuto della tabella. Le tabelle sono uguali in tutti i db sia come nome sia come struttura / definizione delle colonne.

    Si fa una insert nella tabella di destinazione dei dati cosi come sono nelle tabelle remote.

    Le SP in realtà sono 2 e sono eseguite in due momenti diversi (la prima oggi, la seconda tra 15 gg). La prima volta crea il db di destinazione e la tabella. In questo caso funziona tutto bene, se pur lento (ma penso sia dovuto principalmente alla lettura via rete).

    La seconda volta invece va in lettura e scrive sul db che è già presente...in questo caso fallisce dopo un po' che è in esecuzione senza dare errore. La history del job che invoca la SP non dice molto sul perchè fallisce...eppure il comando sql è lo stesso.

    Secondo voi trattandosi di una mole di dati imponente (il db di destinazione pesa circa 400 GB dopo l'esecuzione delle 2 SP.

    Ovviamente essendo una insert massiva, il log cresce molto (il db è in simple mode)...

    Avete idea su come ottimizzare una SP cosi e sul perchè fallisce quando inserisce i dati la seconda volta in un db già popolato?

    mercoledì 24 luglio 2013 13:20

Tutte le risposte

  • Ciao phantom-x,

    la SP sarebbe da vedere, ma in linea generale i cursori vengono sconsigliati per le scarse prestazioni, e solitamente si invita a rivedere le query, quasi sempre ricostruibili senza cursori, con qualche accorgimento.

    Riguardo alla "seconda passata" sul database, a naso penso a possibili chiavi duplicate. Sarebbe utile conoscere la struttura delle tabelle in gioco, e avere qualche indicazione sulla SP.


    emiliano musso

    mercoledì 24 luglio 2013 14:22
  • Ciao a tutti,

    al di là dei cursori, che, come correttamente dice Emiliano, sarebbe meglio trasformare in operazioni set based (quelle per cui SQL Server performa al meglio, se devi fare dei cicli meglio scalare utilizzando un'applicazione/servizio che ti consente poi di parallelizzare anche i processi altrimenti seriali), volevo aggiungere che potrebbero anche esserci problemi di network.

    In questo senso ci sarebbe da capire dove sta questo server remoto, sia geograficamente, sia a livello di domain, per cercare di ridurre al minimo anche i bottleneck di rete.

    Se la mole di dati è così imponente, la transazione che "gira" tra i due server non è trascurabile nemmeno per il traffico che crei in rete.


    Alessandro Alpi SQL Server MVP

    giovedì 25 luglio 2013 10:18
    Moderatore