Oracle Tuning Opq
-
Upload
juan-sanchez -
Category
Education
-
view
4.733 -
download
3
description
Transcript of Oracle Tuning Opq
Oracle 10g Tuning
Oracle Parallel Query (OPQ) yParticionamiento de Tablas
Juan Sánchez – [email protected]
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]
• 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
• 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
• 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?
• 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
• 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 …
• 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
• 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
• ¿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
• 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
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
• 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
• 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
• 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
• 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
• 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
• 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
• 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
• Ejemplo Lista de valores
Juan Sánchez – [email protected] Sánchez – [email protected]
Particionamiento de tablas
• 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
• 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
• 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
• 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
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
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
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 '/';
• 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
• 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
• Datapump
• expdp
• impdp
• Replicación
• Reconstrucción de objetos
Juan Sánchez – [email protected] Sánchez – [email protected]
Más allá de DML/Select