Oracle Tuning Opq

30
Oracle 10g Tuning Oracle Parallel Query (OPQ) y Particionamiento de Tablas Juan Sánchez – [email protected]

description

Introducción a las consultas en Paralelo y Tablas particionadas

Transcript of Oracle Tuning Opq

Page 1: Oracle Tuning Opq

Oracle 10g Tuning

Oracle Parallel Query (OPQ) yParticionamiento de Tablas

Juan Sánchez – [email protected]

Page 2: Oracle Tuning Opq

ObjetivosObjetivos

1. Visión General

2. Parámetros de Inicialización

3. Partido de tablas

4. Uso de OPQ

5. Ejemplos

Juan Sánchez – [email protected] Sánchez – [email protected]

Page 3: Oracle Tuning Opq

• Oracle Parallel Query

• Partición de una consulta entre n CPUs

• Recomendado en operaciones:

• FTS en tablas Grandes

• Ordenaciones

• Subconsultas

• Carga de datos

• Entornos: Decission Suport + Data WarehouseJuan Sánchez – [email protected] Sánchez – [email protected]

Visión General

Page 4: Oracle Tuning Opq

• SQL DML y SELECT

• Se ejecuta un proceso coordinador + ( n procesos * grado paralelismo)

Juan Sánchez – [email protected] Sánchez – [email protected]

Visión General

Page 5: Oracle Tuning Opq

• Generación del proceso coordinador

• Subdivisión del trabajo en unidades

• Petición de procesos esclavos

• Asignación procesos esclavos a unidades trab

• Recolección y combinación de los resultados

• Devolución resultado conjunto

• Liberación procesos esclavos

Juan Sánchez – [email protected] Sánchez – [email protected]

¿Cómo funciona?

Page 6: Oracle Tuning Opq

• Oracle mantiene un pool de procesos esclavos

• Un proceso esclavo solo puede estar asignado a una instrucción SQL

• Al finalizar la instrucción se libera el proc.esc.

• PARALLEL_MIN_SERVERS, PARALLEL_MAX_SERVERS

• Cada proceso esclavo tiene su propia area de memoria

Juan Sánchez – [email protected] Sánchez – [email protected]

Procesos esclavos

Page 7: Oracle Tuning Opq

• Nº CPUsNº CPUs

• Si Grado Paralelismo<Nº CPU Esperas!!!

• Siempre existe un proceso coordinador

• Nº Discos donde se almacena tablaNº Discos donde se almacena tabla

• Si Grado Paralelismo>Nº discosEsperas!!!

Juan Sánchez – [email protected] Sánchez – [email protected]

Rendimiento depende de …

Page 8: Oracle Tuning Opq

• 1 CPU y paralelizado activado1 CPU y paralelizado activado

• Buena idea si CPU tiene que esperar por E/S mientras que el otro hilo puede continuar

• PARALLEL_MAX_SERVERS entre 2 y 4

• Sobreuso de la paralelizaciónSobreuso de la paralelización

• Saturación de recursos

Juan Sánchez – [email protected] Sánchez – [email protected]

Notas importantes

Page 9: Oracle Tuning Opq

• División registros tablas en diferentes datafiles según criterios arbitrarios

• Una tabla particionada puede estar contenida en 1 o más datafiles

• Cada una de las particiones puede ser accedida en paralelo

Juan Sánchez – [email protected] Sánchez – [email protected]

Particionamiento de tablas

Partición 1

tablaPartición 2

Partición 3

Posible Paralelización

DML / Select

Page 10: Oracle Tuning Opq

• ¿Por qué particionar?

• Mejora del rendimiento Ejemplo muy básico Tablas e Índices en tablespaces diferentes

• Adaptación del almacenamiento al contenido de datos de la tabla

• RMAN más eficiente

• CBO utiliza OPQ

• Uso másivo de las CPUs

Juan Sánchez – [email protected] Sánchez – [email protected]

Particionamiento de tablas

Page 11: Oracle Tuning Opq

• Se puede particionar una o más columnas

• Cada partición tiene asignada una Partition Key (columnas seleccionadas)

• Métodos de particionado

• Rango de valores

• Valores de una lista

• Column Hashing

• Combinados Rango+Hash o Rango+List

Juan Sánchez – [email protected] Sánchez – [email protected]

Particionamiento de tablas

Page 12: Oracle Tuning Opq

Una tabla sin particionarUna tabla sin particionar

<><>

Una tabla con 1 particiónUna tabla con 1 partición

Juan Sánchez – [email protected] Sánchez – [email protected]

Particionamiento de tablas

Page 13: Oracle Tuning Opq

• Limitaciones

• Un registro solo puede pertenecer a una partición

• No se puede partir una tabla que es parte de un cluster

• Número máximo de particiones 1024K-1

• No se puede partir una tabla que contiene columnas LONGLONG or LONG RAWLONG RAW

Juan Sánchez – [email protected] Sánchez – [email protected]

Particionamiento de tablas

Page 14: Oracle Tuning Opq

• Part. según RANGO de VALORESRANGO de VALORES

• Division registro según "condición" p.e. Año de Fecha

• Valor condicional es dinámico

• Tener en cuenta valor "fuera de rango"

• Atención a DML

Juan Sánchez – [email protected] Sánchez – [email protected]

Particionamiento de tablas

Page 15: Oracle Tuning Opq

• Ejemplo Rango de datosCREATE TABLE TABLA_PARTCREATE TABLE TABLA_PART

((

COLUMN1 VARCHAR2(20) NOT NULL, COLUMN2 DATE,COLUMN1 VARCHAR2(20) NOT NULL, COLUMN2 DATE,

CONSTRAINT TABLA_PARTICIONADA_PK PRIMARY KEYCONSTRAINT TABLA_PARTICIONADA_PK PRIMARY KEY

( COLUMN1 )( COLUMN1 )

))

TABLESPACE "USERS"TABLESPACE "USERS"

PARTITION BY RANGE(COLUMN2)PARTITION BY RANGE(COLUMN2)

((

PARTITION PART VALUES LESS THAN(PARTITION PART VALUES LESS THAN(to_date(to_date('2010-01-01','YYYY-MM-DD'))'2010-01-01','YYYY-MM-DD'))

TABLESPACE "EXAMPLE",TABLESPACE "EXAMPLE",

PARTITION PART2 VALUES LESS THAN(PARTITION PART2 VALUES LESS THAN(MAXVALUEMAXVALUE))

TABLESPACE "USERS"TABLESPACE "USERS"

););

INSERT INTO TABLA_PART VALUES('A',TO_DATE('2010-01-01','YYYY-MM-DD'));INSERT INTO TABLA_PART VALUES('A',TO_DATE('2010-01-01','YYYY-MM-DD'));

INSERT INTO TABLA_PART VALUES('B',TO_DATE('2009-01-01','YYYY-MM-DD'));INSERT INTO TABLA_PART VALUES('B',TO_DATE('2009-01-01','YYYY-MM-DD'));

COMMIT;COMMIT;

SELECT * FROM DBA_EXTENTS WHERE segment_name='TABLA_PART';SELECT * FROM DBA_EXTENTS WHERE segment_name='TABLA_PART';

Juan Sánchez – [email protected] Sánchez – [email protected]

Particionamiento de tablas

Page 16: Oracle Tuning Opq

• Part. según LISTA de VALORESLISTA de VALORES

• Division registro según "condición" p.e. Tipo de Cliente

• Valor condicional es fijo Foreign Key

• Tener en cuenta valor "fuera de rango"

Juan Sánchez – [email protected] Sánchez – [email protected]

Particionamiento de tablas

Page 17: Oracle Tuning Opq

• Ejemplo Lista de valoresCREATE TABLE TABLA_PARTCREATE TABLE TABLA_PART

((

COLUMN1 VARCHAR2(20) NOT NULL, COLUMN2 VARCHAR2(2),COLUMN1 VARCHAR2(20) NOT NULL, COLUMN2 VARCHAR2(2),

CONSTRAINT TABLA_PARTICIONADA_PK PRIMARY KEYCONSTRAINT TABLA_PARTICIONADA_PK PRIMARY KEY

( COLUMN1 )( COLUMN1 )

))

TABLESPACE "USERS"TABLESPACE "USERS"

PARTITION BY LIST(COLUMN2)PARTITION BY LIST(COLUMN2)

((

PARTITION PART VALUES ('ES') TABLESPACE "EXAMPLE",PARTITION PART VALUES ('ES') TABLESPACE "EXAMPLE",

PARTITION PART2 VALUES (PARTITION PART2 VALUES (DEFAULTDEFAULT) TABLESPACE "USERS") TABLESPACE "USERS"

););

INSERT INTO TABLA_PART VALUES('A','ES');INSERT INTO TABLA_PART VALUES('A','ES');

INSERT INTO TABLA_PART VALUES('B','FR');INSERT INTO TABLA_PART VALUES('B','FR');

COMMIT;COMMIT;

SELECT * FROM DBA_EXTENTS WHERE segment_name='TABLA_PART';SELECT * FROM DBA_EXTENTS WHERE segment_name='TABLA_PART';

Juan Sánchez – [email protected] Sánchez – [email protected]

Particionamiento de tablas

Page 18: Oracle Tuning Opq

• Part. según HASHINGHASHING

• Se calcula hash de un conjunto de columnas

• Se puede asignar como conjunto

• Limitaciones:• Máximo 16 columnas

• ROWID, UROWID no permitidos

• LONG, LOB no permitidos

• Mejor rendimientonºparticiones potencia de 2

Juan Sánchez – [email protected] Sánchez – [email protected]

Particionamiento de tablas

Page 19: Oracle Tuning Opq

• Ejemplo Lista de valoresCREATE TABLE TABLA_PARTCREATE TABLE TABLA_PART

((

COLUMN1 VARCHAR2(20) NOT NULL, COLUMN2 VARCHAR2(2),COLUMN1 VARCHAR2(20) NOT NULL, COLUMN2 VARCHAR2(2),

CONSTRAINT TABLA_PARTICIONADA_PK PRIMARY KEYCONSTRAINT TABLA_PARTICIONADA_PK PRIMARY KEY

( COLUMN1 )( COLUMN1 )

))

TABLESPACE "USERS"TABLESPACE "USERS"

PARTITION BY HASH(COLUMN2) PARTITIONS 4 PARTITION BY HASH(COLUMN2) PARTITIONS 4

STORE IN (TABSP1,TABSP2,TABSP3,TABSP4)STORE IN (TABSP1,TABSP2,TABSP3,TABSP4)

;;

INSERT INTO TABLA_PART VALUES('A','ES');INSERT INTO TABLA_PART VALUES('A','ES');

INSERT INTO TABLA_PART VALUES('B','FR');INSERT INTO TABLA_PART VALUES('B','FR');

COMMIT;COMMIT;

SELECT * FROM DBA_EXTENTS WHERE segment_name='TABLA_PART';SELECT * FROM DBA_EXTENTS WHERE segment_name='TABLA_PART';

Juan Sánchez – [email protected] Sánchez – [email protected]

Particionamiento de tablas

Page 20: Oracle Tuning Opq

• Ejemplo Lista de valores

Juan Sánchez – [email protected] Sánchez – [email protected]

Particionamiento de tablas

Page 21: Oracle Tuning Opq

• Atención a Invalidación de indices si en tabla:

• COALESCE

• DROP

• EXCHANGE

• MERGE

• MOVE

• SPLIT

• TRUNCATEJuan Sánchez – [email protected] Sánchez – [email protected]

Particionamiento de tablas

Page 22: Oracle Tuning Opq

• Métodos de particionado

• Local

• Misma estructura que sus tablas particionadas

• Mejor opción debido a mnto automático

• Global Index

• ïndices con estructura diferente de tablas part

• Exigen mantenimiento manual

• Un índice cubre todas las particiones

Juan Sánchez – [email protected] Sánchez – [email protected]

Particionamiento de índices

Page 23: Oracle Tuning Opq

• Oracle controla nivel paralelismo

• Se puede obligar mediante:

• Hints de paralelizaciónSQL> select /*+ FULL(employee_table) SQL> select /*+ FULL(employee_table)

PARALLEL(employee_table, 2) */PARALLEL(employee_table, 2) */

employee_nameemployee_name

from employee_table where salary > 10000;from employee_table where salary > 10000;

• Modificar el nivel de paralelismo de la tablaSQL> select degree from user_tablesSQL> select degree from user_tables

SQL> CREATE TABLE TABLA1 (COL1 VARCHAR2(20)) PARALLEL 2;SQL> CREATE TABLE TABLA1 (COL1 VARCHAR2(20)) PARALLEL 2;

Juan Sánchez – [email protected] Sánchez – [email protected]

Obligar paralelismo

Page 24: Oracle Tuning Opq

• Desactivar en una tabla paralelizada

SQL> alter table mitabla parallel SQL> alter table mitabla parallel (degree 1 instances 1);(degree 1 instances 1);

SQL> alter table mitabla noparallel;SQL> alter table mitabla noparallel;

• Desactivar en un índice paralelizado

SQL> alter index miindice parallel SQL> alter index miindice parallel (degree 1 instances 1);(degree 1 instances 1);

SQL> alter index miindice noparallel; SQL> alter index miindice noparallel;

Juan Sánchez – [email protected] Sánchez – [email protected]

Desactivar paralelismo

Page 25: Oracle Tuning Opq

Juan Sánchez – [email protected] Sánchez – [email protected]

Parámetros Sistema

Nº máximo de ejecuciones en paralelo

Si valor bajo posiblemente DML/Select no se utilizará OPQ, aún siendo posible

Si valor muy alto se consumiran excesivos recursos en horas punta.

parallel_max_serversparallel_max_servers

Nº minimo de ejecuciones en paraleloparallel_min_serversparallel_min_servers

Si TRUE:• Gestión automática por Oracle• DBA solo declara nivel paralelismo en tabla• parallel_adaptive_multi_user configurado

dinámicamente• Incremento almacenamiento en Large Pool

parallel_automatic_tuning parallel_automatic_tuning

DescripciónDescripciónParámetroParámetro

Page 26: Oracle Tuning Opq

Juan Sánchez – [email protected] Sánchez – [email protected]

Parámetros Sistema

Si TRUE:• Mejora rendimiento en entornos multiuser• Se asume ajuste optimo en entorno

monousuario

parallel_adaptive_multi_userparallel_adaptive_multi_user

DescripciónDescripciónParámetroParámetro

Page 27: Oracle Tuning Opq

Juan Sánchez – [email protected] Sánchez – [email protected]

Parámetros Ocultos Sistema

Controla el úmbral por el que CBO invoca el uso de OPQ

_parallelism_cost_fudge_factor

DescripciónDescripciónParámetroParámetro

SELECT a.ksppinm "Parameter", a.ksppdesc "Description",SELECT a.ksppinm "Parameter", a.ksppdesc "Description",

b.ksppstvl "Session Value", c.ksppstvl "Instance Value"b.ksppstvl "Session Value", c.ksppstvl "Instance Value"

FROM x$ksppi a, x$ksppcv b, x$ksppsv cFROM x$ksppi a, x$ksppcv b, x$ksppsv c

WHERE a.indx = b.indx and a.indx = c.indx andWHERE a.indx = b.indx and a.indx = c.indx and

a.ksppinm LIKE '/_parallel%' escape '/';a.ksppinm LIKE '/_parallel%' escape '/';

Page 28: Oracle Tuning Opq

• Vistas

• v_$pq_sysstat;v_$pq_sysstat;

• v_$px_process;v_$px_process;

• v_$px_sesstat;v_$px_sesstat;

• v_$px_process_sysstat;v_$px_process_sysstat;

Juan Sánchez – [email protected] Sánchez – [email protected]

Informe Uso Paralelización

Page 29: Oracle Tuning Opq

• Tomar snapshot con statspack

• Realizar consultaselect to_char(snap_time,'yyyy-mm-dd HH24') mydate,select to_char(snap_time,'yyyy-mm-dd HH24') mydate,

new.value nbr_pqnew.value nbr_pq

from perfstat.stats$sysstat old,from perfstat.stats$sysstat old,

perfstat.stats$sysstat new,perfstat.stats$sysstat new,

perfstat.stats$snapshot snperfstat.stats$snapshot sn

where new.name = old.name and new.name = 'queries parallelized'where new.name = old.name and new.name = 'queries parallelized'

and new.snap_id = sn.snap_id and old.snap_id = sn.snap_id-1and new.snap_id = sn.snap_id and old.snap_id = sn.snap_id-1

and new.value > 1and new.value > 1

order by to_char(snap_time,'yyyy-mm-dd HH24');order by to_char(snap_time,'yyyy-mm-dd HH24');

Juan Sánchez – [email protected] Sánchez – [email protected]

Informe Uso Paralelización

Page 30: Oracle Tuning Opq

• Datapump

• expdp

• impdp

• Replicación

• Reconstrucción de objetos

Juan Sánchez – [email protected] Sánchez – [email protected]

Más allá de DML/Select