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

Domanda sulla cache di SQL Server

Quando si esegue la query, i dati vengono letti in memoria in blocchi. Questi blocchi rimangono in memoria ma "invecchiano". Ciò significa che i blocchi sono contrassegnati con l'ultimo accesso e quando SQL Server richiede un altro blocco per una nuova query e la cache di memoria è piena, il blocco utilizzato meno di recente (il più vecchio) viene espulso dalla memoria. (Nella maggior parte dei casi, i blocchi di scansione di tabelle intere vengono immediatamente invecchiati per evitare che le scansioni di tabelle intere eccedano la memoria e strozzino il server).

Quello che sta succedendo qui è che i blocchi di dati in memoria della prima query non sono stati ancora eliminati dalla memoria, quindi possono essere utilizzati per la seconda query, il che significa che l'accesso al disco è evitato e le prestazioni sono migliorate.

Quindi la tua domanda in realtà è "posso ottenere i blocchi di dati di cui ho bisogno in memoria senza leggerli in memoria (in realtà facendo una query)?". La risposta è no, a meno che tu non voglia memorizzare nella cache le intere tabelle e farle risiedere in memoria in modo permanente che, dal momento della query (e quindi dalla dimensione dei dati) che stai descrivendo, probabilmente non è una buona idea.

La soluzione migliore per migliorare le prestazioni è esaminare i piani di esecuzione delle query e vedere se la modifica degli indici potrebbe fornire un risultato migliore. Ci sono due aree principali che possono migliorare le prestazioni qui:

  • creazione di un indice in cui la query potrebbe utilizzarne uno per evitare query inefficienti e scansioni complete di tabelle
  • aggiunta di più colonne a un indice per evitare una seconda lettura del disco. Ad esempio, hai una query che restituisce le colonne A e B con una clausola where su A e C e hai un indice sulla colonna A. La tua query utilizzerà l'indice per la colonna A che richiede la lettura di un disco ma poi richiede un secondo disco premi per ottenere le colonne B e C. Se l'indice contiene tutte le colonne A, B e C, è possibile evitare il secondo colpo del disco per ottenere i dati.