Ámbito del DBA / SQL WTF Webcast Introducción
Agenda DBA World :) Introducción a Modelos Introducción a la Arquitectura Cliente/Servidor. Breves comparaciones. Introducción a PostgreSQL. Arquitectura SQL en general. ANSI
DBA World!
El ámbito del DBA App Desarrollo DBA Middleware Database Arq. Datos o Desarrollo OS Sysadmin Hardware
Presencia del DBA en las capas Queries, transanctions Drivers, Connections, Caching App Middleware Schema, Config Database Filesystem, Kernel OS Storage, RAM, CPU, Network Hardware
Donde está el DBA? Es el encargado de mantener la base bien configurada y andando. Mejorar la performance del SBBDD. Administrar las conexiones, replicaciones. Asegurarse la disponibilidad de la base. Proponer mejoras en la Arq. De datos de acuerdo al motor utilizado. Medir y prevenir posibles bounds en el CPU o I/O del servidor. todo esto tratando de no desaparecer...
Inside the DBA :) Muchas escrituras? Solo lecturas? Cabe en memoria? Podemos tener un HW RAID? Podemos tener un SW RAID? Tenemos una cantidad inmensa de datos como para tener un SAN/NAS? Que tipo de HW RAID deberíamos tener de acuerdo a las escrituras?
Introducción a los modelos
Porqué Bases de datos? Los SGBD nacieron con el propósito de solventar los siguientes problemas de los antiguos sistemas: Redundancia e inconsistencia de Datos. Dificultad en el acceso concurrente. Aislamiento de datos. Problemas de integridad. Problemas de atomicidad. Anomalías en el acceso concurrente. Problemas de Seguridad.
Visión de Datos Nivel físico. Es como se guardan los datos en disco. Solo es importante conocerlos si es DBA o desarrollador del motor. Nivel Lógico. Es el nivel en el cual trabaja el DBA y el Arquitecto de datos. Nivel de vistas. Es el nivel en el cual trabaja el desarrollador de la aplicación final y el cual verá el usuario de la misma.
Independecia Física Físico Disposición de elementos del motor sobre los sistemas de almacenamiento. Ayuda a mejorar la performance. Lógico Disposición de los objetos dentro de la base. Ayuda a mejorar la comprensión. Característica que puede adicionar seguridad a nivel de gestor.
Modelos Lógicos Modelo Entidad Relación (DER) Modelo Orientado a Objetos. Modelo de datos semántico. Modelo de datos funcional. Indican el diseño lógico de datos, No indican datos reales o ya implementados i
Modelos lógicos basados en registros Ojeto-Relacional. Postgresql, Oracle Modelo relacional Mysql, DB2, SQLServer El modelo de red El modelo jerárquico Sistemas de Archivos (pueden ser considerados Bases de Datos). Orientado a Objetos DB4O
Arquitecturas Backend Cliente Cliente... Proceso Archivo/s Backend Servidor Servidor / Cluster de servidores Datos Derby BerkeleyDB Mysql Postgresql - Firebird Oracle DB2 - Greenplum
El punto de vista de Stonebraker Capacidades De búsqueda /soporte multiusuario Mayor velocidad SGBD relacional Sistemas De archivos Mysql Derby SGBD O-R SGBD OO Postgresql DB4O Complejidad de los datos y ampliabilidad Menor velocidad
Tipos de BBDD W O D Web Apps. Generalmente caben en memoria. Querys simples No siempre ACID. Pueden ser BASE OLTP Apps Generalmente más grandes que lo disponible en memoria. Mayor cantidad de escritura DatawareHouse Applications Dbs grandes (e/100gb -100TB) Consultas complejas
De acuerdo al Storage In-memory Single Storage (un disco o un RAID) SAN/NAS o Varios RAID Una sola base, distribuida en varios Storage. Varias bases de un cluster distribuidas en varios storages. Distribuidas Bases de datos distribuidas (varios servidores)
Principios de la integridad de datos Atomicidad Consistencia Aislamiento (Isolation) Durabilidad NOTA: PostgreSQL es ACID
Otros principios BASE (Basically Available, Soft state, Eventually consistent) Muy común para aplicaciones de juegos online.
Transacciones Colección de operaciones (sucesión de acciones) que forman una unidad lógica de trabajo, y que posiblemente actualice varios elementos de datos. Transacción 1 Commit Transacción 2 Commit Base de Datos Log de transacciones
Estados transaccionales Activa Parcialmente comprometida Fallida Abortada Comprometida (COMMIT) Rollback (No se aborta, se vuelve a un determinado punto o inicio de transacción)
Introducción a Postgresql
Historia 1977-1985 Michael Stonebraker Inicia postgresql como Ingres en la Universidad de Berkeley, California. 1986, comprado por Computer Associates. 1989, Liberada la primera versión como Postgres. 1994-95 dos estudiantes graduados de Berkeley Jolly Chen y Andrew Yu añaden SQL a Postgres y lo llaman Postgres95. 1996, (1000 colaboradores) Se decidió quitar el 95 al nombre para liberarse de la cronología y nace PostgreSQL. Ultima version al momento 8.4 y 8.5 en desarrollo. http://archives.postgresql.org/pgsql-advocacy/2004-12/msg00033.php
Su hermandad con Informix Stonebraker empezó Ingres (1977). Luego de varias empresas, desembarcó en Illustra. Después (1995) unos estudiantes tomaron POSTGRES y lo siguieron desarrollando, le pusieron Postgres95 y después se pasó a llamar PostgreSQL. En 1996 la empresa que hacía Informix compró Illustra y dejaron de lado la base de datos Illustra, y en cambio usaron los ingenieros y la tecnología para avanzar un poco más con Informix. En el 2001 la empresa Informix se dividió en dos y la parte que tenía que ver con la base de datos fue a parar a IBM.
Postgresql, descripción Es el SGBD Open Source mas potente del mercado. Posee casi 30 años de desarrollo. Licencia BSD de Berkeley. Esta en la vanguardia de la investigacion en al tecnología transaccional. Es ACID. Es segura. Tiene alternativas comerciales de muchísima calidad. Ej: EnterpriseDB, CyberTech(Alemania), etc. Tiene otras alernativas (forks) FastDB, Bizgres, etc.
Postgresql, descripción (2) Es un motor Objeto-Relacional [*]. Cliente/servidor Extensible Multiples conectores desde lenguajes de programación. Lenguaje procedimental propio (PL/pgsql) y extendido (PL/PERL, PL/PYTHONu, PL/JAVA, PL/RUBY, PL/R, C, C++...)
SQL:2003 El estandar SQL:2003 define las siguientes características que se peuden implementar en las bases Objeto relacionales: Rowtype Tipos definidos y rutinas por usuario. Poliformismo Herencia Tipos de referencia e identidad de objetos (el OID es uno de ellos) Tipos de colección (ARRAY, MULTISET, SET, LIST) Ampliación del SQL para hacerlo computacionalmente completo. Soporte para objetos de gran tamaño (BLOB y CLOB) Recursión.
Carácterísticas El modelo es de cliente/servidor (hoy en día el más común, pero no el único). Su lenguaje procedimental es muy similar al PL de Oracle, logrando una migración mas amena. Se adapta a los standares SQL:2003. Posee MVCC (Multi-Version Concurrency Control). Fue una de las pioneras (la primera fue InterBase) Posee WAL (Write Ahead LOG). Herencia de tablas. Puntos de recuperacion avanzados (savepoints, replicacion asincronica) Optimizador de consultas. Juegos de caracteres UNICODE e internacionalización.
Características (2) Tipos de datos accesorios: Números de presición arbitraria (creando numeros más complejos) Text de largo ilimitado. Figuras geometricas, con funciones asociadas. (Cube, contrib) IpV4 y 6. Mac Address. Arrays (Nuevas funciones en 8.4) Postgis (necesita un capítulo aparte). Citext (insensitive case text type - 8.4)
Características - Límites Maximo de la BD: ilimitado. De Tablas: 32 TB. De tupla: 1.6 TB. De campo: 1 GB Tuplas x tabla: ilimitado. Índices por tabla: ilimitado. Bloque: 8k
Características - Índices Pueden ser definidos por el usuario: Btree (por defecto y el más común), Hash, GIN (Generalized Inverted, ex RTree) y Gist (Generalized Index Storage). Basados en expresiones. Parciales Bitmaps. Gin es más lento para inserciones pero más rápido para búsqueda de texto (se usa para Full Text Search). Gist es bueno para datos complejos o raros (figuras geométricas, tsvector, etc)
Características - Avanzadas Restricciones Referential Integrity Constraints. Evita eliminaciones accidentales. Transacciones BEGIN END- SAVEPOINTS. Anidación de consultas avanzadas. Conexiones encriptadas vía SSL. Dominios, clustering, tablespaces, schemas y otros objetos de agrupación. TOAST (atributos comprimidos largos, transparente al usuario). Soporte de funciones de ventana y recursivas.
Como postgres promete ACID?
Soluciones para ACID [A]tomicidad (transacciones indivisibles) [C]onsistencia [I]solation,aislamiento (no se pueden ver entre transacciones) [D]urabilidad: éxito de una transaccion que perdura.
Solución para [A] Sentencias de BEGIN, END, ROLLBACK, COMMIT y SAVEPOINT.
Solución para [C] A partir de 7.*, gestor de integridad: not null check unique primary key fk -match full y partial
Solución para [I] MVCC Multi Versión Concurrency Control Impide el bloqueo de la tabla
Solución para [D] WAL (write Ahead Log) /var/pg_xlog Acelera los tiempos de commit y de insercion y update. En caso de caída, las transacciónes cmprometidas pero que no llegaron a la base, permanecen en la WAL.
SQL [Solo Quiero Licuado]
Álgebra Relacional Operaciones de conjunto aplicadas a relaciones: unión( ), intersección( ) y diferencia(-) Operaciones que eliminan una parte de las relaciones: selección(σ) y proyección(π) Operaciones que combinan las tuplas de dos relaciones: producto cartesiano(x), combinación natural (><) y theta Operación que cambia el nombre de los atributos ó relación: renombre(ρ)
Gráfico http://www.codeproject.com/kb/database/visual_sql_joins.aspx
Lenguajes DDL DML Control de transacciones Control de permisos
Sentencias básicas DML SELECT INSERT UPDATE TRUNCATE
SELECT SELECT [ ALL DISTINCT [ ON ( expression [,...] ) ] ] * expression [ AS output_name ] [,...] [ FROM from_item [,...] ] [ WHERE condition ] [ GROUP BY expression [,...] ] [ HAVING condition [,...] ] Fuentes Predicado [ { UNION INTERSECT EXCEPT } [ ALL ] select ] [ ORDER BY expression [ ASC DESC USING operator ] [ NULLS { FIRST LAST } ] [,...] ] [ LIMIT { count ALL } ] [ OFFSET start ] [ FOR { UPDATE SHARE } [ OF table_name [,...] ] [ NOWAIT ] [...] ] Condición Agrupación Conjunción Ordenación Filtro Bloqueos where from_item can be one of: [ ONLY ] table_name [ * ] [ [ AS ] alias [ ( column_alias [,...] ) ] ] ( select ) [ AS ] alias [ ( column_alias [,...] ) ] function_name ( [ argument [,...] ] ) [ AS ] alias [ ( column_alias [,...] column_definition [,...] ) ] function_name ( [ argument [,...] ] ) AS ( column_definition [,...] ) from_item [ NATURAL ] join_type from_item [ ON join_condition USING ( join_column [,...] ) ]
INSERT INSERT INTO table [ ( column [,...] ) ] { DEFAULT VALUES VALUES ( { expression DEFAULT } [,...] ) [,...] query } [ RETURNING * output_expression [ AS output_name ] [,...] ]
UPDATE UPDATE [ ONLY ] table [ [ AS ] alias ] SET { column = { expression DEFAULT } ( column [,...] ) = ( { expression DEFAULT } [,...] ) } [,...] [ FROM fromlist ] [ WHERE condition WHERE CURRENT OF cursor_name ] [ RETURNING * output_expression [ AS output_name ] [,...] ]
DELETE - TRUNCATE DELETE FROM [ ONLY ] table [ [ AS ] alias ] [ USING usinglist ] [ WHERE condition WHERE CURRENT OF cursor_name ] [ RETURNING * output_expression [ AS output_name ] [,...] ] TRUNCATE [ TABLE ] name [,...] [ CASCADE RESTRICT ]
DELETE ejemplo (solo postgres)
Condicionales de SQL CASE COALESCE NULLIF GREATEST AND LEAST
Subquerys - SemiJoins Operadores: NOT IN, IN (list) or (query), EXIST, NOT EXIST, ANY, SOME, ALL
Ejemplos SELECT col_a, col_b FROM relacion_r; (Proyección) SELECT * FROM relacion_r WHERE col = 1; (Selección) SELECT * FROM relacion_r UNION SELECT * FROM relacion_s; (Union) SELECT * FROM relacion, relacion2; (Producto Cartesiano)- CROSS JOIN SELECT * FROM relacion_r INTERSECT SELECT * FROM relacion_s; (Interseccion) SELECT * FROM relacion_r EXCEPT SELECT * FROM relacion_s; (Exepción) SELECT * FROM relacion_r AS r INNER JOIN relacion_s AS s ON (r.c = s.c); (Equi-join) SELECT * from relacion_r NATURAL JOIN relacion_s; (sin repetir columnas del Equi-join)
Funciones Funciones que devuelven conjunto de datos generate_series(), etc. Agregación Sum, count, avg De Ventana rank() OVER (partition by campo) De resultado Now(), to_number(), etc...
Ejemplos con funciones Window Functions SELECT row_number() OVER (PARTITION BY cp), * FROM (SELECT * FROM anses2 LIMIT 10) s; SELECT * FROM (SELECT * FROM anses2 WINDOW w as (PARTITION BY cp) LIMIT 10) s; Agregación SELECT sum(col) as total FROM tabla; Resultado SELECT now(); SRF (retornan conjunto) SELECT * FROM generate_series(1,10);
Sentencias básicas DDL CREATE ALTER DROP
DDL create table varios( state char(2), name varchar(30), children integer, distance float, budget numeric(19,2), born date, checkin time, started timestamp default CURRENT_TIMESTAMP ); comment on table varios IS 'ejemplo de tabla con varios datos y un default'; CREATE TABLE statename ( code CHAR(2) PRIMARY KEY, name CHAR(30) ); COMMENT ON statename IS 'tabla de paises'; create table customer ( customer_id integer, name char(30), telephone char(20), state char(2) references statename ); COMMENT ON customer IS 'ingresar un state que este en statename'; create table employee ( employee_id integer primary key, name varchar(20), weight float ); create table llaves_compuestas( col1 integer, col2 integer, primary key(col1,col2) );
...DDL (cont) create table llaves_foraneas_compuestas( col3 integer, col4 integer, foreign key (col3, col4) references llaves_compuestas ); create table t_con_check( nombre varchar(20) CHECK (length(trim(nombre)) > 1), sexo char(1) CHECK(sexo IN ('M','F')), fecha_pasada date CHECK(fecha_pasada BETWEEN '1990-01-01' AND CURRENT_DATE), CHECK (upper(trim(nombre))!= 'EMA') --check de tabla );
ALTER ejemplos prueba=# alter table customer add primary key(customer_id); NOTICE: ALTER TABLE / ADD PRIMARY KEY creará el índice implícito «customer_pkey» para la tabla «customer» ALTER TABLE prueba=# create table coches( customer integer references customer, modelo varchar(4) ); CREATE TABLE prueba=# create index ix_btree_customer on customer USING btree(customer_id) TABLESPACE prueba; Prueba=# create index ix_h_cutomer on customer USING hash(customer_id) TABLESPACE prueba;
Vistas simples Con la vista se puede hacer una simulacion del sinonym de Oracle (Permite dar un alias a una tabla). De esta forma: CREATE VIEW tablaalias AS 'Select * from tabla'; -- No confundir con las vistas materializadas!!! De la misma forma podemos crear una funcion para que retorne un record set... CREATE OR REPLACE FUNCTION simula(integer) IMMUTABLE LANGUAGE SQL AS 'Select * from tabla where columna = $1';
Control transaccional BEGIN END SAVEPOINT COMMIT ROLLBACK PREPARE TRANSACTION ROLLBACK PREPARED
Ejemplo básico
Control permisos GRANT REVOKE
</DBA Webcast>