¿Cómo maneja SQL Server los datos para una consulta donde no hay suficiente espacio en la memoria caché del búfer?

10

Mi pregunta es ¿cómo maneja SQL Server una consulta que necesita extraer más volumen de datos en la memoria caché del búfer que el espacio disponible? Esta consulta contendría múltiples combinaciones, por lo que el conjunto de resultados no existe en este formato ya en el disco y necesitaría compilar los resultados. Pero incluso después de la compilación, todavía requiere más espacio del que está disponible en la memoria caché del búfer.

Daré un ejemplo. Supongamos que tiene una instancia de SQL Server que tiene un total de 6 GB de espacio disponible en la memoria caché de búfer. Ejecuto una consulta con varias combinaciones que lee 7 GB de datos, ¿cómo puede SQL Server responder a esta solicitud? ¿Almacena temporalmente los datos en tempdb? ¿Falla? ¿Hace algo que solo lee datos del disco y compila segmentos a la vez?

Además, ¿qué sucede si intento devolver 7 GB de datos totales? ¿Cambia eso la forma en que SQL Server lo maneja?

Ya conozco varias formas de abordar esto, solo tengo curiosidad por saber cómo SQL Server maneja esta solicitud internamente cuando se ejecuta como se indica.

Además, estoy seguro de que esta información existe en algún lugar, pero no he podido encontrarla.

Dustin
fuente
1
En términos simples, SQL Server almacenará las tablas de trabajo y los resultados de su propio procesamiento interno en tempdb. Las páginas se leen del disco cuando es necesario. Las páginas permanecerán en la memoria hasta que se eliminen, o cuando SQL esté listo para confirmarlas en el disco. Esto es cuando ejecuta una consulta grande tempdb crecerá. He visto consultas que ponen de rodillas a un sistema porque a tempdb se le permitió crecer sin control y consumió todo el espacio restante en la unidad. Sé que esto no es 100% exacto, solo trato de explicarlo simplemente. La parte que usa los datos no es la parte que administra la ubicación de esos datos
datagod

Respuestas:

13

Las páginas se leen en la memoria según sea necesario, si no hay memoria libre disponible, la página más antigua no modificada se reemplaza por la página entrante.

Esto significa que si ejecuta una consulta que requiere más datos de los que caben en la memoria, muchas páginas vivirán una vida muy corta en la memoria, lo que generará muchas E / S.

Puede ver este efecto mirando el contador "Esperanza de vida de la página" en el Monitor de rendimiento de Windows. Mire https://sqlperformance.com/2014/10/sql-performance/knee-jerk-page-life-expectancy para obtener algunos detalles excelentes sobre ese contador.

En los comentarios, usted preguntó específicamente qué sucede cuando los resultados de la consulta son mayores que el espacio disponible en el búfer. Tome el ejemplo más simple select * from some_very_big_table;: suponga que la tabla tiene 32 GB y max server memory (MB)está configurada en 24 GB . Todos los 32 GB de datos de la tabla se leerán en páginas en el búfer de la página, una a la vez, enclavadas, formateado en paquetes de red y enviado a través del cable. Esto sucede página por página; podría tener 300 consultas de este tipo ejecutándose al mismo tiempo, y suponiendo que no ocurriera ningún bloqueo, los datos de cada consulta se leerían en el espacio de búfer de la página, una página a la vez, y se colocarían en el cable tan rápido como el cliente pueda solicitar y consumir los datos. Una vez que todos los datos de cada página se han enviado al cable, la página se desbloquea y será reemplazada rápidamente por alguna otra página del disco.

En el caso de una consulta más compleja, por ejemplo, agregando resultados de varias tablas, las páginas se extraerán a la memoria exactamente como se indica arriba según lo requiera el procesador de consultas. Si el procesador de consultas necesita espacio de trabajo temporal para calcular los resultados, lo sabrá por adelantado cuando compile un plan para la consulta y solicitará espacio de trabajo (memoria) a SQLOS . SQLOS en algún momento (suponiendo que no se agote el tiempo de espera ), otorgará esa memoria al procesador de consultas, momento en el que se reanudará el procesamiento de consultas. Si el procesador de consultas comete un error al calcular la cantidad de memoria que debe solicitar SQLOS, es posible que deba realizar un "derrame al disco"operación, donde los datos se escriben temporalmente en tempdb en una forma intermedia. Las páginas que se han escrito en tempdb se desbloquean una vez que se escriben en tempdb para dejar espacio para que otras páginas se lean en la memoria. Eventualmente, el proceso de consulta volverá a los datos almacenados en tempdb, paginado al usar el enclavamiento, en páginas en el búfer que están marcadas como libres.

Indudablemente, me falta una carga de detalles muy técnicos en el resumen anterior, pero creo que captura la esencia de cómo SQL Server puede procesar más datos de los que caben en la memoria.

Max Vernon
fuente
Por curiosidad, ¿qué tipo de consulta extrae 7 GB de datos? Espero que este sea un proceso por lotes.
datagod
Probablemente no muchos y tienes razón, es de esperar que sea un proceso por lotes. Tenía curiosidad por ver cómo SQL manejaría esa solicitud
Dustin
5

No puedo hablar sobre qué haría exactamente su consulta en este escenario, pero SQL Server tiene varias opciones dependiendo de cuánto se necesite.

  • Los datos pueden "derramarse" a TempDB, esto estaría usando su disco
  • Las páginas antiguas se pueden sacar de la memoria caché del búfer
  • SQL Server puede cargar algunas páginas en la memoria caché del búfer, usarlas y luego rotar nuevas páginas en

La mejor manera de averiguar qué sucedería es crear el escenario en un entorno de desarrollo y averiguarlo.

Arthur D
fuente
2

Mi pregunta es cómo maneja SQL Server una consulta que necesita extraer más volumen de datos en la memoria caché del búfer, entonces hay espacio disponible

Para responder a esta parte específica, déjame decirte cómo se gestiona esto. Las páginas tienen un tamaño de 8 KB. Cuando ejecuta una consulta que solicita un gran conjunto de datos y que requiere que se traigan numerosas páginas a la memoria, SQL Server no traerá todas las páginas de una vez. Localizará las páginas específicas y traerá una a una páginas individuales de 8 KB a la memoria, leerá los datos y le dará el resultado, y esto continuará ahora. el disco como @Max señaló. Como adivinó correctamente, esta poca memoria puede ralentizar las cosas, ya que pasaría algún tiempo eliminando páginas antiguas. Aquí es donde el punto de control y Lazywriterentra en escena. Lazywriter es para asegurarse de que siempre haya algo de memoria libre para traer nuevas páginas al disco. Cuando se encuentra un búfer libre bajo, se activa y crea espacios libres para que sean páginas nuevas.

EDITAR

Lo entiendo, pero la parte que me desconcierta un poco es lo que sucede si te unes a \ datos de filtrado y esos resultados exceden el tamaño de la caché.

La memoria para unir y filtrar se decide incluso antes de que se ejecute la consulta y supongamos que realmente hay un problema de memoria y la memoria requerida para ejecutar la operación no está disponible. El procesador SQL Server otorgará la "memoria requerida", que es

Memoria requerida: memoria mínima necesaria para ejecutar sort y hash join. Se llama obligatorio porque una consulta no comenzaría sin esta memoria disponible. El servidor SQL usa esta memoria para crear estructuras de datos internas para manejar la clasificación y la combinación hash.

Entonces, al menos, la consulta comenzará a ejecutarse, pero durante el tiempo de ejecución es muy probable que el resultado intermedio se derrame a Tempdb, lo que lo hace lento. Le sugiero que lea Comprensión de la memoria de consulta Grant

Shanky
fuente
Lo entiendo, pero la parte que me desconcierta un poco es lo que sucede si te unes a \ datos de filtrado y esos resultados exceden el tamaño de la caché. Los datos tendrían que compilarse para producir el conjunto de retorno, pero el conjunto de retorno es mayor que el tamaño de la memoria caché. ¿Sigue internamente el ciclo de las páginas a través del caché hasta que produce el resultado final? Mi pensamiento sería que escribiría los resultados en tempdb ya que excedía el caché y luego lo leería desde el disco, pero no sé si ese es el caso
Dustin
2
@Dustin Editó mi respuesta, por favor verifique
Shanky