En la undécima conferencia del curso Introducción a las bases de datos de CMU (2020, 39:37), Andy Pavlo afirma que "solo los sistemas de datos de gama alta admiten el escaneo de búfer compartido, pero Postgres y MySql no". Él no se expande y, por lo tanto, traté de averiguar por qué, pero no pude encontrar ninguna información resumida y quería preguntar aquí antes de sumergirme en la documentación. ¿Andy quiso decir que Postgres no puede admitir esto debido a su implementación, o simplemente aún no se ha implementado?
Si no se puede implementar, ¿qué pasa con el diseño de Postgres que impide que lo haga? ¿Cómo se puede eludir esto? Si es posible, ¿qué impide la implementación hoy? Gracias por adelantado.
Al escuchar la charla, dice algo como:
Si hacemos una unión por fusión, tenemos que ordenar las tablas. Ahora bien, si detectamos que dos consultas quieren ordenar los mismos datos al mismo tiempo, sería genial si las consultas pudieran superponerse entre sí. Los sistemas de gama alta pueden hacer eso, pero Postgres y MySQL no pueden.
Eso es solo parcialmente cierto.
Es cierto que cada backend (cada consulta) que quiere ordenar tiene que hacerlo por su cuenta, y no hay forma de compartir los resultados ordenados.
Pero no creo que sea una característica muy valiosa:
Cualquiera de las dos consultas probablemente verá diferentes versiones de los datos (imagine una fila insertada entre el inicio de las dos consultas), por lo que no podrían compartir el resultado de todos modos. Por lo tanto, esto solo podría usarse si dos consultas desean ordenar exactamente el mismo conjunto de filas exactamente de la misma manera aproximadamente al mismo tiempo, lo que parece un caso demasiado complicado para agregar una característica complicada. Compartir datos entre backends de PostgreSQL es difícil debido a la arquitectura multiproceso de PostgreSQL.
Pero lo que PostgreSQL puede hacer (y aquí el orador está equivocado) es hacer que dos consultas compartan un escaneo secuencial de la misma tabla: si deja synchronize_seqscans en su valor predeterminado de on , una segunda consulta que quiera escanear la misma tabla como un la consulta que ya se está ejecutando simplemente se conectará a la exploración secuencial en ejecución. Eso es más fácil, porque los datos están en shared_buffers , que es un recurso compartido. Esta característica reduce la E/S si tiene muchas exploraciones secuenciales simultáneas de la misma tabla.