Máxima Performance Postgresql Disertante: Emanuel Calvo Franco. Año: 2009
Nuevo temario Entendiendo el EXPLAIN. Actualizar Recolectar estadísticas. Indices. Performance Tips.
Explain es tu amigo Permite ir más allá de ejecutar consultas. Ayuda a comprender que es lo que puede estar fallando del servidor. No siempre la consulta más elegante es la más performante :)
Resumen Este comando permite visualizar y entender cual es la forma en que el optimizador analiza y devuelve los resultados. Es de gran ayuda cuando queremos ver posibles defectos en la arquitectura de nuestra base de datos.
Sintáxis: # EXPLAIN [ANALYZE] [VERBOSE] <query> Insert Update select
Conceptos básicos Coste Operador Tiempo (no vamos a entrar en explicaciones filosóficas de que es esto :) Tamaño de datos (esto podría tener una explicación más extensa, pero es entendible de solo pensar en ella)
Coste Cost( 1ra fila ultima) de acuerdo a valores de coste explícitos en el postgresql.conf
Operadores Seq Scan Nested Loop Index scan Merge Join Sort (*work_mem) Hash and Hash Join Unique Group Limit Aggregate Subquery Scan and Subplan Append Tid Scan (raro) Result Materialize
EXPLAIN y EXPLAIN ANALYZE
Más operadores del ANALYZE select * from accounts a, history h where a.aid = h.aid;
Manipulando el optimizador Desactivamos la búsqueda por escaneo de índices?
Clean & Update me! VACUUM VACUUM FULL VACUUM ANALYZE ANALYZE REINDEX Reacomodan tuplas muertas Acumulan estadísticas Cualquier consulta, ejecuten \h VACUUM \ ANALYZE
Estadísticas El catálogo contiene las estadísticas de acceso, campos frecuentes y demás de todos los objetos del CLUSTER.
Ejemplo práctico de estadísticas. Tener en cuenta de tener las estadísticas bien actualizadas (ANALYZE y VACUUM).
Frecuencia de valores A mayor frecuencia de aparición, favorecerá que el optimizador opte por el seqscan Por sobre otros operadores :O
Cantidad de valores distintos.
Deseo más estadísticas! ALTER TABLE chares ALTER COLUMN texto SET STATISTICS 10;
I/O por objeto pg_statio_all_indexes pg_statio_sys_indexes pg_statio_user_indexes pg_statio_all_sequences pg_statio_sys_sequences pg_statio_user_sequences pg_statio_all_tables pg_statio_sys_tables pg_statio_user_tables
Índices Btree (binario) Gin (mejor para texto) GIST (datos complejos) Comunes Por expresion o funcionales Hash (no recomendable aún) CREATE INDEX ix_accounts1 ON accounts USING hash (aid) tablespace ts_indices;
Índices funcionales CREATE INDEX ix_chares_func ON chares (hashtext(texto));
Incidencia de NULLs en Índices parapruebas=# update chares set texto = NULL where texto ~ '^1[1 2 3]';
Performance Tablespaces dedicados a objetos. RAID si o si en servidores. Economía? RAID0 con PITR. Bases chicas, normalizar en buen nivel y redundar información con vistas materializadas. Después de grandes cambios en los datos, correr VACCUM y ANALYZE. CREATE TABLE AS o CLUSTER permitirá que las lecturas en los índices más rápida.
Performance Influencie el optimizador para detectar posibles discrepancias en el resultado a través de las variables CPU_INDEX_TUPLE, CPU_OPERATOR_COST, CPU_TUPLE_COST, EFFECTIVE_CACHE_SIZE, RANDOM_PAGE_COST. Minimice la carga de red y de las máquinas locales haciendo la mayor parte del trabajo en el servidor. Esto incluye los procedimientos, funciones, disparadores.
Performance Prefiera utilizar multinucleos para Postgres, el sistema de forks permite una distribución en los recursos. Si utiliza 'large objects' realice seguido vacuum_lo (incluido en los contrib). Trate de utilizar FreeBSD para sistemas medianos y Solaris para sistemas de buenos recursos. PL/Perl es un exelente lenguaje para realizar tareas complejas y eficientes.
Performance Pgbench es una buena herramienta para medir y mejorar nuestra configuración.
Monitoreando sistema #!/bin/bash ipcs -m head -4 echo iostat 1 1 echo vmstat echo free echo ps -efwwa grep post staty.sh # watch interval=1./staty.sh
ZFS y XFS Las estadísticas demuestran que XFS tiene mejor rendimiento que el resto de los formatos de partición de Linux. ZFS permite realizar tareas más complejas y avanzadas.
Comparaciones
Comparaciones
Gracias Pipol!