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?

  • Limpiaremos el caché de datos.
  • Comprobamos que realmente se ha limpiado
  • Consultaremos sobre tablas de Adventureworks desde varias bases de datos.
  • Usaremos la DMV del post anterior para medir las páginas en caché.
    • Con el monitor de rendimiento se pueden obtener las páginas de datos totales, pero no a nivel de base de datos que es lo que estamos buscando.

 

  1. limpiamos el caché de datos con la siguiente instrucción:

dbcc dropcleanbuffers

 

  1. 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).

 

  1. 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;

go

 

  1. Comprobamos el uso y distribuicó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.

 

 

Eladio Rincón