none
SQL SEVER 2008: Non rilascia la memoria alla fine del processo. RRS feed

  • Domanda

  • Salve a tutti. Ho una domanda da farvi. Ho un server con 4GB di ram con windows server 64bit Service Pack 2. Quando lancio una query pesante l'occupazione di memoria schizza al 95% ed è quello che mi aspettavo visto che la query è pesante ed usa tabelle temporanee per velocizzare la stessa. Il problema è che la memoria non viene rilasciata, neanche quando viene chiuso sql management. Ovviamente viene rilasciata solo se riavvio il servizio sql. Per ulteriori info, per potermi aiutare, vi segnalo che la query è lanciata attraverso SSIS e l'output della query è messa in un File.txt .

    Grazie, ciao

    mercoledì 10 agosto 2011 15:17

Risposte

  • Prima di tutto un chiarimento: la memoria utilizzata da SQL Server non ha niente a che fare con il fatto che sia aperto o chiuso SQL Server Management Studio, che è solamente un'applicazione client, un'interfaccia grafica per i comandi T-SQL che vengono passati all'engine di SQL Server.

    Quando a SQL Server viene passata una richiesta di esecuzione di una query (sia essa dal Management Studio, da riga di comando, da applicazione .NET) viene occupata la memoria necessaria (nei vari buffer gestiti da SQL Server). Poichè di mestiere fa il server e precisamente deve rispondere alle richieste di esecuzione di query da parte dei suoi utenti, le pagine di memoria utilizzate non vengono rilasciate immediatamente dopo il loro utilizzo, così se per caso devono essere riutilizzati gli stessi dati SQL li trova già in memoria e non è costretto a rileggerli dal disco...

    Solo quando il sistema operativo richiede più memoria (e SQL Server non la usa effettivamente per cui non può ridargliela) viene rilasciata una parte della memoria.

    SQL Server è in grado di auto-ottimizzarsi, ma puoi intervenire sulla gestione della memoria modificando il parametro "Max server memory", dalle proprietà del server in SSMS o mediante la sp_configure. Questo pararametro indica a SQL di non usare tutta la RAM disponibile, ma solamente fino al valore indicato (Es. 2GB). Ovviamente in questo modo SQL Server avrà meno memoria a disposizione, con il rischio che non ne abbia a sufficienza per risolvere le tue query e quindi va monitorato...

    HTH

     


    Danilo Dominici MCP MCDBA MCITP MCSE MCAD Questo post è fornito "così com'è". Non conferisce garanzie o diritti di alcun tipo. Ricorda di usare la funzione "segna come risposta" per i post che ti hanno aiutato a risolvere il problema e "deseleziona come risposta" quando le risposte segnate non sono effettivamente utili. Questo è particolarmente utile per altri utenti che leggono il thread, alla ricerca di soluzioni a problemi similari. ENG: This posting is provided "AS IS" with no warranties, and confers no rights. Please remember to click "Mark as Answer" on the post that helps you, and to click "Unmark as Answer" if a marked post does not actually answer your question. This can be beneficial to other community members reading the thread.
    mercoledì 10 agosto 2011 16:11

Tutte le risposte

  • Prima di tutto un chiarimento: la memoria utilizzata da SQL Server non ha niente a che fare con il fatto che sia aperto o chiuso SQL Server Management Studio, che è solamente un'applicazione client, un'interfaccia grafica per i comandi T-SQL che vengono passati all'engine di SQL Server.

    Quando a SQL Server viene passata una richiesta di esecuzione di una query (sia essa dal Management Studio, da riga di comando, da applicazione .NET) viene occupata la memoria necessaria (nei vari buffer gestiti da SQL Server). Poichè di mestiere fa il server e precisamente deve rispondere alle richieste di esecuzione di query da parte dei suoi utenti, le pagine di memoria utilizzate non vengono rilasciate immediatamente dopo il loro utilizzo, così se per caso devono essere riutilizzati gli stessi dati SQL li trova già in memoria e non è costretto a rileggerli dal disco...

    Solo quando il sistema operativo richiede più memoria (e SQL Server non la usa effettivamente per cui non può ridargliela) viene rilasciata una parte della memoria.

    SQL Server è in grado di auto-ottimizzarsi, ma puoi intervenire sulla gestione della memoria modificando il parametro "Max server memory", dalle proprietà del server in SSMS o mediante la sp_configure. Questo pararametro indica a SQL di non usare tutta la RAM disponibile, ma solamente fino al valore indicato (Es. 2GB). Ovviamente in questo modo SQL Server avrà meno memoria a disposizione, con il rischio che non ne abbia a sufficienza per risolvere le tue query e quindi va monitorato...

    HTH

     


    Danilo Dominici MCP MCDBA MCITP MCSE MCAD Questo post è fornito "così com'è". Non conferisce garanzie o diritti di alcun tipo. Ricorda di usare la funzione "segna come risposta" per i post che ti hanno aiutato a risolvere il problema e "deseleziona come risposta" quando le risposte segnate non sono effettivamente utili. Questo è particolarmente utile per altri utenti che leggono il thread, alla ricerca di soluzioni a problemi similari. ENG: This posting is provided "AS IS" with no warranties, and confers no rights. Please remember to click "Mark as Answer" on the post that helps you, and to click "Unmark as Answer" if a marked post does not actually answer your question. This can be beneficial to other community members reading the thread.
    mercoledì 10 agosto 2011 16:11
  • "Solo quando il sistema operativo richiede più memoria (e SQL Server non la usa effettivamente per cui non può ridargliela) viene rilasciata una parte della memoria."

    Ed invece la memoria viene rilasciata quando inizio una seconda query comunque pesante, ma su diversi dati?

    A me sembra di no, infatti attualmente l'occupazione di memoria è al 90%, se lancio un ulteriore query và al 95% o +. Inoltre la query che ha occupato memoria è stata lanciata ieri alle 15:00, quindi dopo 18 ore, la memoria è ancora occupata.

    Quindi innanzitutto ti ringrazio per i chiarimenti datimi prima, e te ne chiedo altri per i nuovi dubbi.

    Grazie ciao

    giovedì 11 agosto 2011 07:24
  • Ciao Pasquale,

    l'accesso alla ram è ovviamente infinitamente più veloce dell'accesso ai dischi. Questi ultimi richiedono lo spostamento fisico di una testina e l'accesso ai settori tramite rotazione di un supporto, esattamente come i dischi di vinile. Va da se che l'apparato meccanico attorno a un disco ne impedisce performances confrontabili con una matrice solida ad accesso elettrico.

    La tendenza di Sql è quindi quella di portare in ram "tutto ciò che può servire" e tenerlo lì, pronto per ogni eventuale query. In linea teorica un server Sql lavora al meglio quando la ram supera (abbondantemente) le dimensioni dei databases. In questa condizione tutto il database viene portato in ram e Sql usa i dischi in tempo reale solo per la scrittura del log (che è sequenziale e quindi ottimizza, se non c'è deframmentazione, lo spostamento della testina).

    La scrittura dei dati fisici viene allora rimandato ad un processo in background asincrono che non interferisce con le performances (Nella situazione ideale in cui log e dati stanno su dischi diversi).

    Il risultato è che su un server orientato a sql server si ottengono comportamenti straordinariamente efficienti. Spesso però un unico server visne usato per molte applicazioni concorrenti (IIS, Exchange, che pure applicano principi analoghi) e quindi si osservano comportamenti "imprevisti".

    Come ha spiegato Danilo Sql implementa strumenti per rilasciare la memoria se richiesta dal OS ma certamente non lavora al massimo se altre applicazioni gli sottraggono continuamente memoria.

    Insomma, hai vari scenari, se quel server è dedicato all'accesso ai dati lascia che Sql si mangi tutta la ram, è un buon segno, non un cattivo segno.

    Se al server stai facendo fare di tutto valuta la partizione della memoria per ogni applicazione (come detto da Danilo, in Sql, via Max Server Memory) ed eventualmente anche il partizionamento dell'accesso ai processori. Si tratta comunque di operazioni complesse, da testare con cura e da valutare caso per caso.

    marc.

    giovedì 11 agosto 2011 07:51
  • Ciao Marcello,

    tutto chiaro. Il server è dedicato a sql server. Quindi non mi preoccuperò della saturazione della ram. Proverò a chiedere ai sistemisti quache blocco di ram in più.

    Grazie, ciao

    giovedì 11 agosto 2011 07:58