elementos desarrolladores - repositorio.siu.edu.ar

83
SQL++ Consideraciones para desarrolladores Capacitación PostgreSQL

Upload: others

Post on 08-Jul-2022

10 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: elementos desarrolladores - repositorio.siu.edu.ar

SQL++Consideraciones para desarrolladores

Capacitación PostgreSQL

Page 2: elementos desarrolladores - repositorio.siu.edu.ar

AgendaAlgunas ideas con tipos de datosNormalizaciónAlgo sobre estructura jerárquicas.Indización & trucos.Un touch de tsearch.SQL tips.Hábitos de Diseño y Buenas prácticas.Entendiendo el Explain.FTSXMLServidores de desarrolloCTELISTEN-NOTIFYHerencia

Page 3: elementos desarrolladores - repositorio.siu.edu.ar

Tipos de datos

Use textMás eficiente y menos 'ruidoso'No más límites ficticios.

Trate de evitar los casteosSi sus consultas apestan de casteos, ud esta guardando los datos de una forma poco conveniente.

Trate de manipular datos con funcionesEvite el dolor de cabeza posterior de datos mal grabados.Evite que lo haga la aplicación. La idea es usar el servidor de varios u$s ;)

Page 4: elementos desarrolladores - repositorio.siu.edu.ar

Consistencias

Fuerce la consistencia de sus datos a través de tipos y dominios propios:

CREATE DOMAIN nom_ape as TEXT CHECK (VALUE ~ $$\w(\s|),(\s|)\w$$);CREATE DOMAIN texto as TEXT CHECK (VALUE ~ ' '^\\w(\s|),(\s|)\\w$');SELECT 'l , l'::nom_ape;CREATE DOMAIN us_postal_code AS TEXTCHECK(VALUE ~ '^\\d{5}$'OR VALUE ~ '^\\d{5}-\\d{4}$');

Page 5: elementos desarrolladores - repositorio.siu.edu.ar

Definiendo setsTrate de utilizar ENUM

Page 6: elementos desarrolladores - repositorio.siu.edu.ar

Extendiendo mis tipos

Page 7: elementos desarrolladores - repositorio.siu.edu.ar

Un workaround rebuscado

En 8.4 tenemos funciones más especializadas para manejo de arrays.

Page 8: elementos desarrolladores - repositorio.siu.edu.ar

NormalizaciónRefresquemos la memoria....

1NFTodas las columnas deben contener valores escalares.

2NFTodas las columnas que no son llave, deben depender funcionalmente de la PK.

3NFTodas las columnas que no son llave, deben depender directamente de la PK.

Page 9: elementos desarrolladores - repositorio.siu.edu.ar

DenormailizaciónDenormalice para enfrentar problemas de performance en consultas complejas.

Desventaja: Inserts, updates y deletes más lentos.Que porcentaje de cada sentencia DML hay en mi aplicación?

Utilizar por lo menos 2 días el log statement activado y luego parsear para obtener estos datos.

Por defecto 3NF, más normalización implica:Mayor complejidad.Menos redundancia.+ norm... +tablas .... = joins aborrecedoresMayor escalabilidad (relativa)

Page 10: elementos desarrolladores - repositorio.siu.edu.ar

Joins

Left join suele ser más optimizable que INNER JOIN.Si sus consultas aborrecen de joins identicos entre sí, debería pensar en vistas materializadas o redundancia en una tabla separada.La cantidad de JOINS puede disparar GEQO u otros métodos de optimización.

Page 11: elementos desarrolladores - repositorio.siu.edu.ar

Natural y Surrogate Keys

NK , relación natural con la tupla.DNI, matrícula

SKMuchas aplicaciones 3rd party la utilizan.La más famosa es 'id'Hace menos clara la lectura de consultas.No necesariamente los integer mejoran los JOINS ni reducen el I/O desde los archivos.Si se la utiliza, tratar de que sea invisible.Utilice nombres explícitos (actor_id, film_id).

Page 12: elementos desarrolladores - repositorio.siu.edu.ar

Generación de SK

SERIAL es el maquillaje de las secuencias.

Tener cuidado en los dump/restore.

Evite querer limpiar 'huecos'SK están hechas solamente para dar unicidad.

Alternativas:UUID()Timestamp. WARNING cuando tenemos muchas transacciones concurrentes.

Page 13: elementos desarrolladores - repositorio.siu.edu.ar

Foreign Keys

Siempre utilice REFERENCES.Siempre explicite las clausulas:

ON UPDATE CASCADEON DELETE RESTRICTON DELETE SET NULL

Page 14: elementos desarrolladores - repositorio.siu.edu.ar

Modelo Adyacente

Guarde el id padre sobre la misma tabla.Favorece modificaciones en los árboles.Los self-joins pueden ser más performantes.

Consultas más lentasRequiere WITH RECURSIVE (incorporada a 8.4) o CONNECTBY (esta ultima viene con el contrib tablefunc)Rápido para update, lento para búsqueda.

Page 15: elementos desarrolladores - repositorio.siu.edu.ar

Modelo Full Path

Guarda la ruta completa en cada hijo.Viola la teoría de normalización.

SELECT * from tabla WHERE ruta LIKE '1\23\45';Los movimientos de árboles solo requieren la modificación de la columna ruta.

UPDATE tablaSET ruta = replace(ruta,'/1/23/42','/1/5/19')WHERE ruta LIKE /1/23/42%';

Son lentos para UPDATE, rápidos para el SELECT.

Page 16: elementos desarrolladores - repositorio.siu.edu.ar

Indización

Page 17: elementos desarrolladores - repositorio.siu.edu.ar

Sobre-indexación

Todos los DML tocan los índices.BitMap y Multicolumn

BM utiliza mayor memoriaMC implica utilizar un indice por cada columna.

Asegurece de que utiliza los índices.pg_stat_all_indexes.

En vez de utilizar muchos índices, es preferible recurrir a parámetros de almacenamiento de TOAST.Prefiera aumentar la performance con índices por expresión o 'particionados'.

Page 18: elementos desarrolladores - repositorio.siu.edu.ar

Índices

Page 19: elementos desarrolladores - repositorio.siu.edu.ar

Índices

Page 20: elementos desarrolladores - repositorio.siu.edu.ar

Otro ejemplito

Page 21: elementos desarrolladores - repositorio.siu.edu.ar

FTS

Page 22: elementos desarrolladores - repositorio.siu.edu.ar

Full text Search

¿Hace busquedas de texto con '%esto%' en campos de más de 300 caracteres? ¿O utiliza Regex?

Si tiene + de 8.3, piense en tsearch (viene incorporado)

Indices especiales:GIN pesado para updates, veloz para búsqueda.GiST más liviano para updates, no tan veloz para búsquedas.

Si nos interesa el orden o formato del texto NO DEBEMOS USAR FTS SOLO, ya que este evita repeticiones y reordena de menor a mayor.

Page 23: elementos desarrolladores - repositorio.siu.edu.ar

tsearch

Tipo de datoPara tsearch

Consulta conOperadores

Page 24: elementos desarrolladores - repositorio.siu.edu.ar

Tsearch

Leemos un archivo y lo volcamos en una tabla que contiene un solo campo de tipo tsvector.

Page 25: elementos desarrolladores - repositorio.siu.edu.ar

Tsearch

Finalmente podremos hacer nuestra primer consulta básica.Nos falta algo? Si! El índice!

Para tsvector los tipos de índices a utilizar son GiN y GiST.

Page 26: elementos desarrolladores - repositorio.siu.edu.ar

Más acerca de Tsearch

Técnica de Large Object combinada con FTS.

Page 27: elementos desarrolladores - repositorio.siu.edu.ar

XML

Page 28: elementos desarrolladores - repositorio.siu.edu.ar

En el siguiente ejemplo veremos:Leer de un archivo que contiene un xml con una primitiva <add>.Separar los atributos <doc>.Realizar búsquedas y ordenamientos con xpath.

Page 29: elementos desarrolladores - repositorio.siu.edu.ar

-- Extracción ejemplo de un archivo XML con primitiva <add>INSERT INTO main (SELECT pg_read_file('unr.xml',0,800000)::xml);

– Insertar en una tabla los atributos docsINSERT INTO docs ( SELECT p[i] FROM (SELECT xpath('//doc',big)::anyarray FROM main) p(p), (SELECT generate_series(1,array_upper(xpath('//doc',big)::anyarray,1)) FROM main) i(i));

Page 30: elementos desarrolladores - repositorio.siu.edu.ar

ConsultasSELECT regexp_matches(xpath('//field[@name="date"]',doc)::text,$$\d{4}$$) FROM docs WHERE xpath('//field[@name="date"]',doc)::text ~ '2005';

SELECT ctid FROM docs WHERE xpath('//field[@name="date"]',doc)::text ~ '2005' ORDER BY regexp_matches(xpath('//field[@name="date"]',doc)::text,$$\d{4}$$);

SELECT * FROM docs WHERE xpath('//field[@name="date"]',doc)::text ~ '2005' ORDER BY regexp_matches(xpath('//field[@name="date"]',doc)::text,$$\d{4}$$) LIMIT 10;

Page 31: elementos desarrolladores - repositorio.siu.edu.ar

XML + TOAST

La combinación de ambas nos puede dar una funcionalidad 'similar' a Storage Big Table.

ALTER TABLE docs ALTER COLUMN docs SET STORAGE EXTERNAL;

Esto obliga a que el contenido de la columna se guarde fuera de linea y sin compresión.

Page 32: elementos desarrolladores - repositorio.siu.edu.ar

SQL & PL tips

Page 33: elementos desarrolladores - repositorio.siu.edu.ar

Alter con usingCREATE TABLE tablita ASSELECT 'emanuel calvo franco es dba en el siu'::text as texto;select length(texto) from tablita;

ALTER TABLE tablitaALTER COLUMN texto TYPE VARCHAR(20)USING CASE (length(texto) > 20)WHEN true THEN substring(texto,1,20)ELSE texto END;

SELECT length(texto) from tablita;

Page 34: elementos desarrolladores - repositorio.siu.edu.ar

Timestamp

Quitar los milisegundos en timestampcurrent_timestamp::timestamp(0)

Page 35: elementos desarrolladores - repositorio.siu.edu.ar

PL

Siempre explicite los casteos:For i in 1..100000 loop s:= 4e3::int; end loop;

Retornar RECORD? Como?!CREATE FUNCTION ops(OUT a int, OUT b int, IN c int) RETURNS record AS $$ BEGIN a:= c+1; b:=c+2; RETURN; END; $$ LANGUAGE plpgsql;SELECT ops(8); SELECT ops(8).*;

Page 36: elementos desarrolladores - repositorio.siu.edu.ar

PL

Trucos con funciones IMMUTABLE, ya que son evaluadas previo a la generación del plan:

CREATE FUNCTION preCharge(code text) RETURNS text[] AS $f$ SELECT ARRAY(SELECT var::text FROM tabla WHERE col = code); $f$ LANGUAGE SQL IMMUTABLE;SELECT ..... AND col = ANY(preCharge('CODE'));

Page 37: elementos desarrolladores - repositorio.siu.edu.ar

Porque no select *Consulta sin documentación implícita.La consulta puede romper la aplicación si hay modificaciones en el DDL.Anti-performanceNo usar en producción.El muestreo de datos es lo que quizás mayor carga proporcional tenga.

Page 38: elementos desarrolladores - repositorio.siu.edu.ar

CASEWHERE func_lenta() = 'fulano' OR func_lenta() = 'otro'WHERE CASE func_lenta() WHEN 'fulano THEN 1 WHEN 'otro' THEN 2 ELSE 3 END

Foreach ($rows as $id => $row)if () UPDATE tablaSET col * 0.90 WHERE id = $idELSE ...UPDATE tabla set r =(CASE WHEN r>2 THEN r*.90ELSE e * 1.10 END);

Page 39: elementos desarrolladores - repositorio.siu.edu.ar

Group by

Page 40: elementos desarrolladores - repositorio.siu.edu.ar

Agregados propios :0

Page 41: elementos desarrolladores - repositorio.siu.edu.ar

Simular rowcount

Page 42: elementos desarrolladores - repositorio.siu.edu.ar

CTID

Que es el CTID?Es la columna de identificación de registro.Indica la posición 'física' del registro en la tabla.Es extremadamente veloz debido a qe su valor es de registro.No sirve para buscar un registro en particular, debido a que el ctid puede cambiar luego de un vacuum.

Page 43: elementos desarrolladores - repositorio.siu.edu.ar

Eliminación de una tupla duplicada con CTID

Page 44: elementos desarrolladores - repositorio.siu.edu.ar

Un registro

Page 45: elementos desarrolladores - repositorio.siu.edu.ar

Valores NULL

Evite valores nulos en columnas que posiblemente requieran ser indizadas.

Afecta la performance.Suele ser 'sucio'.Incluso es preferible un determinado caractér, en lugar de un valor NULL.

Page 46: elementos desarrolladores - repositorio.siu.edu.ar

Buenas practicasAntes de actualizar/eliminar tuplas, chequear con SELECT.Es buena practica utilizar RETURNING en INSERT y UPDATE.Comente las tablas y columnas!!! (comment on table actor is 'Tabla con nombres de actores';)Bloqueos explícitos.

Más seguros. Más lentos.

Page 47: elementos desarrolladores - repositorio.siu.edu.ar

Técnicas

Page 48: elementos desarrolladores - repositorio.siu.edu.ar

Tecnicas Preferiblemente, utilicemos caracteres para los joins.Otra técnica es la de 'hashear' textos largos.

Mejora cuando todos los campos son distintos.Debemos tratar colisiones de manera 'manual'.

Page 49: elementos desarrolladores - repositorio.siu.edu.ar

Prueba

Page 50: elementos desarrolladores - repositorio.siu.edu.ar

Ejemplo

Page 51: elementos desarrolladores - repositorio.siu.edu.ar

Sin hash

Page 52: elementos desarrolladores - repositorio.siu.edu.ar

Tips de buen diseñoRegla simple : “una idea, una tabla”Probablemente ud necesite más tablas si:

No hay una llave unica.Hay más de una llave única.

Necesitara más tablas si:Esta haciendo muchos joins de uno a uno.

Es mentira que los joins mejoran utilizando ints en vez de text.

Page 53: elementos desarrolladores - repositorio.siu.edu.ar

EXPLAIN y ESTADÍSTICAS

Page 54: elementos desarrolladores - repositorio.siu.edu.ar

Explain es tu amigo...

… pero a los amigos se los entiende! ¬¬ generalmente...

Page 55: elementos desarrolladores - repositorio.siu.edu.ar

Conceptos básicosCoste (es calculado en base a reglas detalladas en el postgresql.conf)

OperadorTiempo (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)

Los valores siempre son estimados!! Pueden variar de acuerdo a las estadísticas y otros factores.

Page 56: elementos desarrolladores - repositorio.siu.edu.ar

Coste

Cost( 1ra fila … ultima) de acuerdo a valores de coste explícitos en el postgresql.conf

Page 57: elementos desarrolladores - repositorio.siu.edu.ar

Operadores

Seq ScanIndex scanSort (*work_mem)

UniqueLimitAggregateAppendResult

Nested LoopMerge JoinHash and Hash JoinGroupSubquery Scan and SubplanTid Scan (raro)Materialize

Page 58: elementos desarrolladores - repositorio.siu.edu.ar

Explain VS Explain Analyze

Page 59: elementos desarrolladores - repositorio.siu.edu.ar

Algunos operadores +

select * from accounts a, history h where a.aid = h.aid;

Page 60: elementos desarrolladores - repositorio.siu.edu.ar

Algo con estadísticas

Recuerde

Actualizar

estadísticas

ALTER TABLE chares ALTER COLUMN texto SET STATISTICS 10;

Page 61: elementos desarrolladores - repositorio.siu.edu.ar

Dan vueltas

A mayor frecuencia de aparición, favorecerá que el

optimizador opte por el seqscanPor sobre otros operadores :O

Page 62: elementos desarrolladores - repositorio.siu.edu.ar

La importancia del Analyze

La recolección de estadísticas es decisiva para la selección de la ruta menos costosa.La variable que indica el valor por defecto y por columna de las estadísticas es default_statistic_target (10).ALTER TABLE tabla ALTER COLUMN columna SET STATISTICS 1000;

Page 63: elementos desarrolladores - repositorio.siu.edu.ar

CTE (8.4)

Page 64: elementos desarrolladores - repositorio.siu.edu.ar

WITH tx(i) as(select * from generate_series(1,8) )select * from tx;

WITH RECURSIVE tx(i) as(select 1 UNION ALL select * from generate_series(1,8) g(k) ) select * from tx;

Page 65: elementos desarrolladores - repositorio.siu.edu.ar

WITH RECURSIVE t(n) AS (VALUES (1)UNION ALLSELECT n+1 FROM t WHERE n < 50)SELECT sum(n) FROM t;

WITH RECURSIVE t(n,m,o,p) AS (SELECT 1,1,1,1UNION ALLSELECT n+1, m+2 ,o+3, n+m+o FROM t)SELECT * FROM t LIMIT 10;

Page 66: elementos desarrolladores - repositorio.siu.edu.ar

Table Functions (tablefunc contrib)

Page 67: elementos desarrolladores - repositorio.siu.edu.ar

Connect bySELECT * FROM connectby('connectby_tree', 'keyid', 'parent_keyid', 'row2', 0, '-')AS t(keyid text, parent_keyid text, level int, branch text);

keyid | parent_keyid | level | branch -------+--------------+-------+----------------row2 | | 0 | row2row4 | row2 | 1 | row2-row4row6 | row4 | 2 | row2-row4-row6row5 | row2 | 1 | row2-row5(4 rows)

Page 68: elementos desarrolladores - repositorio.siu.edu.ar

Crosstab

Page 69: elementos desarrolladores - repositorio.siu.edu.ar

Windowing Functions

Page 70: elementos desarrolladores - repositorio.siu.edu.ar
Page 71: elementos desarrolladores - repositorio.siu.edu.ar
Page 72: elementos desarrolladores - repositorio.siu.edu.ar
Page 73: elementos desarrolladores - repositorio.siu.edu.ar

LISTEN - NOTIFY

Page 74: elementos desarrolladores - repositorio.siu.edu.ar

Utilidad

Permite notificar a un proceso de una determinada acción.

En el caso de los replicadores, utilizan NOTIFY para indicar cuando se efectua una inserción – actualización de un registro.

Page 75: elementos desarrolladores - repositorio.siu.edu.ar

PHP?

NOTIFY prueba;

Page 76: elementos desarrolladores - repositorio.siu.edu.ar

Herencia Avanzada

Page 77: elementos desarrolladores - repositorio.siu.edu.ar
Page 78: elementos desarrolladores - repositorio.siu.edu.ar
Page 79: elementos desarrolladores - repositorio.siu.edu.ar
Page 80: elementos desarrolladores - repositorio.siu.edu.ar
Page 81: elementos desarrolladores - repositorio.siu.edu.ar

Configuración de servidores

Page 82: elementos desarrolladores - repositorio.siu.edu.ar

Servidores de desarrollo

Track_activities = offLogging_collector = offFsync = offmax_prepared_statements = 0 (exepto si desarrollamos herramientas de replicación)Autovacuum = offEn lo posible contar con un set de pruebas similar o extraído de producción.

Page 83: elementos desarrolladores - repositorio.siu.edu.ar

Gracias!!!