Acabando con los mitos: Memoria usada por bases de datos
Hola,
Al hilo del post anterior sobre las DMVs de memoria, me gustaría aclarar el siguiente mito:
"Lecturas a una base de datos (BD1), desde distintas bases de datos (BD2, BD3), implican que en la caché de datos existan varias copias de la información leída de BD1.". La afirmación es errónea, y es lo que quiero demostrar en este post J
¿Cómo lo podemos comprobar?
1; limpiamos el caché de datos con la siguiente instrucción:
dbcc dropcleanbuffers
2; Comprobamos que realmente se ha limpiado:
SELECT
count(*)
AS cached_pages_count
,
count(*)
* 8. / 1024 AS MB
FROM
sys.dm_os_buffer_descriptors
Que en mi caso me devuelve 91 páginas (poco más de 500Kb).
3; Ejecutamos consultas sobre distintas bases de datos:
use
master;
select
count(*)
from AdventureWorks.Sales.SalesOrderHeader;
go
use Tempdb;
select
count(*)
from AdventureWorks.Sales.SalesOrderDetail;
select
count(*)
from AdventureWorks.Sales.SalesOrderHeader;
go
use Northwind;
select
count(*)
from AdventureWorks.Sales.SalesOrderDetail;
4; Comprobamos el uso y distribución de la memoria:
SELECT
count(*)
AS cached_pages_count
,
count(*)
* 8. / 1024 AS MB
,CASE database_id
WHEN 32767 THEN
'ResourceDb'
ELSE
db_name(database_id)
END
AS Database_name
FROM
sys.dm_os_buffer_descriptors
WHERE
db_name(database_id)
IN
('master',
'Adventureworks',
'Northwind',
'Tempdb')
GROUP
BY
db_name(database_id)
,database_id
ORDER
BY cached_pages_count DESC
pages | mb | db_name |
3448 | 26.94 | AdventureWorks |
296 | 2.31 | msdb |
122 | 0.95 | northwind |
99 | 0.77 | master |
54 | 0.42 | ReportServer$INSTANCE1TempDB |
53 | 0.41 | tempdb |
39 | 0.30 | SqlHealth |
38 | 0.30 | ReportServer$INSTANCE1 |
30 | 0.23 | PerfAnalysis |
24 | 0.19 | ResourceDb |
Donde podemos comprobar que a pesar de realizar consultas desde distintas bases de datos (master, tempdb, y Northwind), a otra base de datos (AdventureWorks), las páginas en caché corresponden a solo Adventureworks.
Disclaimer1: después de limpiar los buffers, en mi sistema, el número de páginas en caché se mantiene estable en 91 páginas durante unos segundos, instantes después, crece superando las 800; la distribución que aparece en mi sistema es la siguiente:
pages | mb | db_name |
296 | 2.31 | Msdb |
122 | 0.95 | Northwind |
111 | 0.87 | AdventureWorks |
99 | 0.77 | Master |
54 | 0.42 | ReportServer$INSTANCE1TempDB |
53 | 0.41 | Tempdb |
39 | 0.30 | SqlHealth |
38 | 0.30 | ReportServer$INSTANCE1 |
30 | 0.23 | PerfAnalysis |
24 | 0.19 | ResourceDb |
Aunque no me quita el sueño, no acabo de entender por qué msdb, Northwind, y Adventureworks adquieren esos cientos… lo investigaré J
Disclaimer2: Cuidado con la DMV sys.dm_os_buffer_descriptors, que es bastante consumidora de recursos.