Tengo un sitio web ASP.NET que hace su propio almacenamiento en caché independiente de datos y los datos no cambian durante largos períodos de tiempo, por lo que no es necesario consultar SQL Server por segunda vez con la misma consulta. Necesito mejorar el rendimiento de las consultas por primera vez (vírgenes) que van a ese servidor SQL. Algunas consultas procesan tantos datos que pueden provocar el uso de SQL Server tempdb
. No uso variables de tabla temporal o tablas temporales, por lo que SQL Server decide usarlo tempdb
solo cuando sea necesario.
Mi tamaño de base de datos es de 16 Gb, tengo 32 Gb de RAM física disponible en mi máquina servidor.
Entiendo que la estrategia de almacenamiento en caché de MS SQL Server intenta mantener los datos en la RAM para acelerar el rendimiento de consultas similares si necesitan volver a cargar los mismos datos. Además de eso, intentará usar la RAM disponible en lugar de tempdb para acelerar el rendimiento sin causar acceso al disco.
Supongo que cuando la consulta que necesita almacenar algo en tempdb SQL Server viene y no hay suficiente RAM disponible, SQL Server tiene 2 opciones:
1) descargar algunos datos almacenados en caché y usar RAM ahorrada en lugar de tempdb para evitar escrituras en disco
2) mantenga los datos en caché para futuras consultas y comience a usar tempdb, lo que hace que las escrituras ralenticen el disco.
No sé qué opción tomará SQL Server en esta situación, pero me gustaría que tome la opción # 1 porque solo me importa el rendimiento de las consultas (vírgenes) por primera vez, porque nunca vuelvo a enviar la misma consulta a SQL Server (aunque puedo enviar una consulta similar).
¿Cuál es la estrategia de almacenamiento en caché de SQL Server para este escenario?
¿Cómo equilibra el uso de RAM entre evitar tempdb para consultas vírgenes y la velocidad de consultas por segunda vez?
¿Es posible configurar SQL Server de tal manera que elija # 1? Si es así, entonces cómo ?
¿De qué otra forma puedo aumentar el rendimiento de todas las consultas vírgenes de SQL?
Como no conozco la estrategia de almacenamiento en caché de SQL Server, quiero colocar la base de datos en el disco RAM. Esto asegurará que cualquier consulta virgen tenga una alta velocidad de carga de datos no almacenados en caché, incluso si SQL Server siempre elige la opción # 1. El riesgo de esto es que SQL Server pueda comenzar a usar más tempdb con menos RAM disponible (solo quedan 16 Gb después de usar 16 Gb para RAM Disk) si continúa haciendo la opción # 2, lo que ralentizará las consultas vírgenes que causan derrames tempdb
.
Estoy interesado en la solución para SQL 2008 R2, pero supongo que probablemente sea lo mismo para SQL 2008, SQL 2005 y puede ser SQL 2000.
Aclaraciones:
No hay otras aplicaciones ejecutándose en ese cuadro, está dedicado a SQL Server . El sitio web se ejecuta en una caja separada.
Es SQL Server 2008 R2 Standard Edition 64 bit en Windows Server 2008 R2 Enterprise 64 bit.
Solo ejecuto consultas de solo lectura y la base de datos está configurada para ser de solo lectura .
Supongamos que ya hay buenos índices . Esta pregunta es sobre SQL Server haciendo la elección n. ° 1 frente a la elección n. ° 2, cómo lo hace, si hay una manera de controlarlo y si RAM Disk lo ayuda a tomar la decisión correcta para consultas vírgenes.