En la
primera parte, hablamos sobre las principales innovaciones y cambios en PostgreSQL 11. Esta vez, discutiremos con más detalle algunos puntos en el formato de preguntas / respuestas que surgieron en la reunión.
¿Cuál es la mejor manera de transferir una gran matriz de datos como un conjunto de parámetros de entrada para un procedimiento almacenado en PL / pgSQL?
La forma más conveniente es crear una tabla temporal, hacer copias de los datos allí y luego usarla en el procedimiento.
Motores externos (zheap) y el desarrollo de PostgreSQL en memoria
No todas las cargas de trabajo son adecuadas para un modelo con almacenamiento de versiones antiguas de registros en la tabla misma. En todos los demás subd (versionionniki) se almacenan en un deshacer registro. Puede discutir sobre la viabilidad, pero la conclusión es que necesita almacenar registros antiguos en algún lugar. Si tienen una vida útil corta y alguien rara vez se dirige a ellos, entonces el almacenamiento en la tabla en sí es perjudicial. El motor zheap externo PostgreSQL es un intento de EnterpriseDB de crear un motor de tabla para PostgreSQL con registro de deshacer. Funciona, aunque todavía hay algo que mejorar.
Quien trabaja con la Sra. SQL en el modo de nivel de aislamiento SNAPSHOT, sabe que tiene tempdb, donde coloca las versiones antiguas, y está equipado con una aspiradora completamente al vacío para limpiar tempdb. Por otro lado, la comunidad solicita crear tablas en memoria en PostgreSQL. Esto se puede hacer con bastante facilidad: tmpfs, y eso es todo. En PostgreSQL Pro incluso lanzó la primera versión piloto, puedes probar.
Lo que PostgreSQL nunca tuvo fue motores enchufables. Había índices conectables que usaban un WAL común. PostgreSQL tiene mucho que enchufar y poco para reemplazar sobre la marcha. Por ejemplo, el ejecutor no está deshabilitado, pero ya puede usar nodos personalizados en él que usted mismo programa. Los optimizadores en PostgreSQL son completamente conectables. Puede escribir el suyo y usar PostgreSQL como intérprete de sus consultas. El analizador SQL no se puede conectar.
Los motores quieren conectarse en tres direcciones:
- motor con registro de deshacer
- en memoria
- almacenamiento de columna para consultas OLAP
Postgres Pro está en conversaciones con EnterpriseDB sobre cómo hacer una API para conectar todo esto.
Sobre clave extranjera
La clave externa dentro de PostgreSQL se implementa mediante disparadores. Puede escribir su activador que implementará cualquier tipo de funcionalidad. Todas las restricciones posibles deben hacerse en el disparador. No es particularmente necesario mantener la lógica en los desencadenantes, pero verifique todo, es necesario.
¿Postgres Pro planea hacer SaaS o PaaS?
Postgres Pro planea hacer que PostgreSQL esté más optimizado para la nube, en particular, para implementar cambios dinámicos en los buffers de recursos compartidos, para reducir la cantidad de parámetros que requieren un reinicio de PostgreSQL. No van a construir la nube ellos mismos.
¿Cómo configuro una unidad para que la indexación paralela funcione más rápido? ¿Qué es mejor, múltiples HDD o un SSD?
Mejor unas pocas unidades SSD. Cuantas más opciones de paralelización proporcione el hardware, mejor. Si tiene un disco, memoria insuficiente y un procesador, la paralelización no lo ayudará. Pero los SSD tienen una peculiaridad: comienzan a disminuir si más del 80% del volumen está ocupado. Por lo tanto, no olvide ajustar el ajuste, de lo contrario, el límite del 80% llegará a alrededor del 50%.
Administración de diccionario y agregar palabras en la búsqueda de texto completo
Si usa hechizo o bola de nieve, simplemente cambie el diccionario de palabras de detención. El problema es que si agregó una palabra de parada, entonces no tiene sentido indexar. Esto se puede hacer lentamente. Una palabra de detención se eliminará de una solicitud y nunca se buscará. Y si eliminó la palabra de detención, entonces en ninguna parte de la colección no está allí y debe reindexarla. El problema no está en el diccionario, sino en el hecho de que ya lo ha usado y ha guardado su conocimiento.
Además, en muchos casos, puede usar la función poco conocida ts_rewrite, que le permite reemplazar una parte de la solicitud con otra solicitud. Por ejemplo, cuando el submarino Kursk se ahogó, todos se apresuraron a buscar información al respecto. Fedor Sigaev en ese momento trabajaba en rambler, y a petición de "Kursk" se dio información sobre la ciudad. Inmediatamente hicieron una sustitución: en esta palabra, dar información sobre el submarino. Pero entonces los usuarios comenzaron a maldecir, a quienes les interesaba el pueblo. No sé si se dieron cuenta o no, pero fue necesario presentar la "ciudad de Kursk". Tales sustituciones permiten hacer ts_rewrite. Además, la función se puede utilizar para una transición suave durante el período de cambios del diccionario.
Por supuesto, cambiar el analizador y los diccionarios son tareas complejas. Los idiomas con diferentes alfabetos, como el ruso y el inglés, se llevan bien. Mucho peor ahora son, digamos, textos francés-inglés. No está claro a qué idioma se refiere una palabra, que se escribe de la misma manera, pero en un idioma es una palabra de parada, y en otro no. Postgres Pro está trabajando actualmente en el ajuste de diccionarios para describir configuraciones más complejas.
Cubriendo índices y actualización en caliente
Es completamente amigos. Es cierto que si se actualiza al menos un campo en el índice de cobertura, entonces el índice se comportará como de costumbre, todo será reemplazado.
Incapacidad para crear tablas temporales al ejecutar consultas en espera
PostgreSQL no almacena el conocimiento de la tabla en el directorio del sistema, pero hay un parche que transfiere el conocimiento al directorio del sistema. Por lo tanto, con este parche puede usar tablas temporales. Pero luego surge otro problema: no hay transacciones en espera. Para trabajar con una tabla temporal, deberá usar el doble de la identificación de transacción virtual, que se aplica solo a las tablas temporales, y no a las principales que provienen del asistente. Y cuando observa un número de 32 bits, serán dos números diferentes.
Postgres Pro también tiene un módulo pg_variables, que también funciona en stand by. Esta no es una tabla temporal, pero se puede representar la funcionalidad necesaria.
Implementar índice de clúster
Postgres Pro tuvo varios intentos de implementarlo. Ahora puede ingresar el índice de la tabla de clúster y la tabla estará en el mismo orden. Sufrió cómo mantener una tabla en un estado agrupado. Intentamos diferentes enfoques, pero invariablemente insertarlo en una tabla de este tipo era muy costoso. Y esto no es interesante para nadie. Por lo tanto, hasta ahora se ha concluido que es necesario pasar a Tablas organizadas de índice.
Factor de escala de autovacío recomendado
Por lo general, se recomienda configurar 1 - 5%. Pero esto es completamente opcional. Para tablas pequeñas, en las que, a pesar de los cambios, en promedio, la misma distribución permanece, se puede establecer un valor grande. Si la tabla es grande y rara vez se repone, pero adecuadamente, con un fuerte cambio en la distribución, tendrá que inventar algo más. Todo depende de la distribución de sus datos.
Sugerencias en consultas complejas
En Oracle, con consultas complejas, debe ayudar periódicamente con sugerencias, porque se producen escaneos completos repentinos. Hay sugerencias en Postgres Pro, bastante malhumoradas, pero puedes obtenerlas. Sin embargo, no hay sugerencias en PostgreSQL regular, y es poco probable que aparezcan. Si tiene sugerencias incorporadas, los usuarios que se enfrentan a un problema del optimizador insertan sugerencias, se calman y no informan ningún problema. El desarrollo del optimizador se detiene.
Por cierto, el optimizador PostgreSQL tiene un problema. Cuando estima una muestra de una tabla, incluso por una cantidad más o menos razonable, adivina con algún error. Luego comienza a conectarse, el resultado se conecta a otra cosa, el error se acumula y en el tercer o cuarto nivel PostgreSQL falla mucho.
Existe tal configuración: unirse al límite de colapso. PostgreSQL clasifica JOIN para un uso más eficiente, pero el límite de clasificación predeterminado es 8. Si hay más de 8 JOINs seguidos, el sistema no los ordenará y habrá una dependencia del orden JOIN en la consulta.
También hay un optimizador genético con varios parámetros. Puede habilitar varias configuraciones en una sesión y describir más o menos cómo se debe ejecutar la solicitud. Usando este orden, con la ayuda de los corchetes puede configurar el cierre de algunas operaciones, el mismo escaneo de segundos. Otra opción es insertar ciertos parámetros en las funciones. En cierto sentido, estos también son pistas. No es muy conveniente, pero al menos algo.