Oracle Tuning Opq

Post on 04-Jul-2015

4.726 views 3 download

description

Introducción a las consultas en Paralelo y Tablas particionadas

Transcript of Oracle Tuning Opq

Oracle 10g Tuning

Oracle Parallel Query (OPQ) yParticionamiento de Tablas

Juan Sánchez – jsancheznav@gmail.com

ObjetivosObjetivos

1. Visión General

2. Parámetros de Inicialización

3. Partido de tablas

4. Uso de OPQ

5. Ejemplos

Juan Sánchez – jsancheznav@gmail.comJuan Sánchez – jsancheznav@gmail.com

• 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 – jsancheznav@gmail.comJuan Sánchez – jsancheznav@gmail.com

Visión General

• SQL DML y SELECT

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

Juan Sánchez – jsancheznav@gmail.comJuan Sánchez – jsancheznav@gmail.com

Visión General

• 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 – jsancheznav@gmail.comJuan Sánchez – jsancheznav@gmail.com

¿Cómo funciona?

• 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 – jsancheznav@gmail.comJuan Sánchez – jsancheznav@gmail.com

Procesos esclavos

• 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 – jsancheznav@gmail.comJuan Sánchez – jsancheznav@gmail.com

Rendimiento depende de …

• 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 – jsancheznav@gmail.comJuan Sánchez – jsancheznav@gmail.com

Notas importantes

• 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 – jsancheznav@gmail.comJuan Sánchez – jsancheznav@gmail.com

Particionamiento de tablas

Partición 1

tablaPartición 2

Partición 3

Posible Paralelización

DML / Select

• ¿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 – jsancheznav@gmail.comJuan Sánchez – jsancheznav@gmail.com

Particionamiento de tablas

• 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 – jsancheznav@gmail.comJuan Sánchez – jsancheznav@gmail.com

Particionamiento de tablas

Una tabla sin particionarUna tabla sin particionar

<><>

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

Juan Sánchez – jsancheznav@gmail.comJuan Sánchez – jsancheznav@gmail.com

Particionamiento de tablas

• 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 – jsancheznav@gmail.comJuan Sánchez – jsancheznav@gmail.com

Particionamiento de tablas

• 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 – jsancheznav@gmail.comJuan Sánchez – jsancheznav@gmail.com

Particionamiento de tablas

• 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 – jsancheznav@gmail.comJuan Sánchez – jsancheznav@gmail.com

Particionamiento de tablas

• 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 – jsancheznav@gmail.comJuan Sánchez – jsancheznav@gmail.com

Particionamiento de tablas

• 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 – jsancheznav@gmail.comJuan Sánchez – jsancheznav@gmail.com

Particionamiento de tablas

• 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 – jsancheznav@gmail.comJuan Sánchez – jsancheznav@gmail.com

Particionamiento de tablas

• 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 – jsancheznav@gmail.comJuan Sánchez – jsancheznav@gmail.com

Particionamiento de tablas

• Ejemplo Lista de valores

Juan Sánchez – jsancheznav@gmail.comJuan Sánchez – jsancheznav@gmail.com

Particionamiento de tablas

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

• COALESCE

• DROP

• EXCHANGE

• MERGE

• MOVE

• SPLIT

• TRUNCATEJuan Sánchez – jsancheznav@gmail.comJuan Sánchez – jsancheznav@gmail.com

Particionamiento de tablas

• 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 – jsancheznav@gmail.comJuan Sánchez – jsancheznav@gmail.com

Particionamiento de índices

• 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 – jsancheznav@gmail.comJuan Sánchez – jsancheznav@gmail.com

Obligar paralelismo

• 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 – jsancheznav@gmail.comJuan Sánchez – jsancheznav@gmail.com

Desactivar paralelismo

Juan Sánchez – jsancheznav@gmail.comJuan Sánchez – jsancheznav@gmail.com

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

Juan Sánchez – jsancheznav@gmail.comJuan Sánchez – jsancheznav@gmail.com

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

Juan Sánchez – jsancheznav@gmail.comJuan Sánchez – jsancheznav@gmail.com

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 '/';

• 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 – jsancheznav@gmail.comJuan Sánchez – jsancheznav@gmail.com

Informe Uso Paralelización

• 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 – jsancheznav@gmail.comJuan Sánchez – jsancheznav@gmail.com

Informe Uso Paralelización

• Datapump

• expdp

• impdp

• Replicación

• Reconstrucción de objetos

Juan Sánchez – jsancheznav@gmail.comJuan Sánchez – jsancheznav@gmail.com

Más allá de DML/Select