Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Cache buffer:cos'è e in che modo influisce sulle prestazioni del database?

In SQL Server, la cache del buffer è la memoria che consente di eseguire rapidamente query sui dati a cui si accede di frequente. Quando i dati vengono scritti o letti da un database di SQL Server, il gestore del buffer li copia nella cache del buffer (nota anche come pool di buffer). Quando è pieno, le pagine di dati più vecchie o utilizzate meno frequentemente vengono spostate sul disco rigido.

Perché devo monitorare la cache del buffer?

L'uso della memoria può avere un impatto significativo sulle prestazioni. Quando la memoria è insufficiente, le pagine di dati vengono eliminate frequentemente dalla cache del buffer. Ciò rallenta le query perché SQL Server deve andare sul disco per trovare la pagina dei dati, ripristinarla nella cache del buffer e quindi leggere la pagina prima che possa restituire i risultati della query.

Ci sono molte ragioni per cui le query iniziano a essere eseguite lentamente. Ma se vuoi escludere problemi di memoria, guarda cosa sta succedendo all'interno della cache del buffer. Una sbirciatina al suo interno identificherà quale database, tabella o indice sta occupando memoria e mettendo sotto pressione il buffer.

Per vedere quale database consuma più memoria, utilizza la query:

SELECT
CASE database_id
WHEN 32767 THEN 'ResourceDb'
ELSE db_name(database_id)
END AS database_name, COUNT(1)/128 AS megabytes_in_cache
FROM sys.dm_os_buffer_descriptors
GROUP BY DB_NAME(database_id) ,database_id
ORDER BY megabytes_in_cache DESC;

Per identificare la tabella o l'indice che consuma più memoria, esegui questa query nel database che desideri ispezionare:

SELECT COUNT(1)/128 AS megabytes_in_cache
,name ,index_id
FROM sys.dm_os_buffer_descriptors AS bd
INNER JOIN
(
SELECT object_name(object_id) AS name
,index_id ,allocation_unit_id
FROM sys.allocation_units AS au
INNER JOIN sys.partitions AS p
ON au.container_id = p.hobt_id
AND (au.type = 1 OR au.type = 3)
UNION ALL
SELECT object_name(object_id) AS name
,index_id, allocation_unit_id
FROM sys.allocation_units AS au
INNER JOIN sys.partitions AS p
ON au.container_id = p.partition_id
AND au.type = 2
) AS obj
ON bd.allocation_unit_id = obj.allocation_unit_id
WHERE database_id = DB_ID()
GROUP BY name, index_id
ORDER BY megabytes_in_cache DESC;

Gestisci la memoria con le metriche

Sebbene sia utile controllare a campione database e indici per un uso eccessivo della memoria, il monitoraggio delle metriche della cache del buffer è davvero il modo migliore per identificare e risolvere i problemi di prestazioni causati dalla pressione interna sulla memoria.

Ecco le cinque principali metriche da monitorare per migliorare i problemi di prestazioni relativi alla memoria:

1. Rapporto hit cache buffer

  • Questa metrica mostra come SQL Server utilizza la cache del buffer
  • Il rapporto di successo identifica la percentuale di richieste di pagina che sono state completate dalle pagine di dati dalla cache del buffer rispetto a tutte le richieste di pagine di dati
  • Le pagine che non si trovano nella cache del buffer vengono lette dal disco, che è molto più lento
  • Il rapporto ideale della cache del buffer è 100 (ovvero, SQL Server legge tutte le pagine dalla cache del buffer e nessuna dal disco)
  • Il valore consigliato della cache del buffer è maggiore di 90

2. Pagina Speranza di vita (PLE)

  • La durata della pagina misura per quanto tempo (in secondi) una pagina di dati rimane nella cache del buffer
  • Più è lungo il PLE, maggiori sono le possibilità che SQL Server legga le pagine dalla cache del buffer e non debba andare sul disco
  • Se la memoria non è sufficiente, le pagine di dati vengono svuotate dalla cache del buffer più spesso per liberare spazio per le nuove pagine
  • Storicamente, quando i sistemi avevano molta meno memoria di quella attuale, un valore PLE "normale" era di 300 secondi
  • Oggi viene utilizzata una formula per determinare il PLE "buono":Page Life Expectancy =300 secondi per ogni 4 GB di RAM sul server
  • Il PLE dovrebbe rimanere stabile se monitorato nel tempo
  • Riduzioni rapide e frequenti indicano problemi di memoria
  • Un calo superiore al 50% dovrebbe essere esaminato immediatamente

3. Letture pagine/sec (livello server)

  • Questa metrica mostra quante letture fisiche (ovvero letture dal disco) si sono verificate in un secondo su tutti i database su un'istanza
  • Le letture fisiche sono costose e lente
  • Riduci le letture fisiche utilizzando una cache di dati più grande, indici intelligenti e query più efficienti o modificando la struttura del database
  • Il valore consigliato è inferiore a 90
  • Un valore maggiore di 90 indica memoria insufficiente e problemi di indicizzazione

4. Scritture pagina/sec

  • Questa metrica mostra il numero di volte in cui le pagine sono state scritte su disco a livello di server in un secondo
  • Il valore consigliato è inferiore a 90

5. Pagine Input/Sec e Pagine Output/Sec (contatori di memoria)

  • Inserimento pagine/sec è il numero di pagine importate dal disco ogni secondo
  • L'output di pagine/sec è il numero di pagine scritte sul disco ogni secondo per fare spazio nella cache del buffer
  • Pagine/sec è la somma delle pagine in ingresso/sec e delle pagine in uscita/sec
  • Se il valore di pagine/sec è costantemente superiore a 50, sono necessarie ulteriori indagini

Una cache del buffer sana è un componente importante per l'ottimizzazione della velocità delle query di SQL Server. Sebbene i problemi di memoria siano solo uno dei numerosi fattori che possono rallentare le risposte alle query, sono abbastanza facili da identificare e risolvere. Il monitoraggio di queste cinque metriche chiave può aiutarti a mantenere le pagine di dati nel pool di buffer più a lungo, in modo che SQL Server non debba perdere tempo a cercare nel disco prima di restituire i risultati della query.