Sunteți pe pagina 1din 30

Paralelización de operaciones

Objetivos
• Describir las ventajas del lenguaje de
manipulación paralela de datos (PDML)
• Usar hints y la cláusula PARALLEL para
definir el grado de paralelismo de una
sentencia DML
• Conocer las restricciones del uso del PDML
• Ejecutar sentencias DML en modo directo
y en tablas particionadas
• Consultar el DD en relación con el PDML
7-2
Introducción
• Las operación DML paralelas aceleran el
acceso a grandes tablas, cuando se
modifican al menos un 1% de las filas
• Útil en entornos DSS o Datawarehouse, y
en ciertas operaciones OLTP
• Oracle8 complementa las consultas
paralelas disponibles en v7 con DML
paralelo
• Muchas operaciones paralelas requieren
7-3
tablas e índices particionados, excepto
INSERT... SELECT...
Beneficios del DML paralelo
• La principal ventaja es el
RENDIMIENTO: el paralelismo puede
acelerar la velocidad de proceso de
transacciones DML P99S1
UPDATE PEDIDO
SET PENDIENTE = ’F’; P99S2

P99ERR
P99S1
UPDATE /*+PARALLEL(PEDIDO,3)*/ PEDIDO
SET PENDIENTE = ’F’; P99S2

P99ERR
7-4
Beneficios del DML paralelo
• Ya no es necesario:
– que múltiples sesiones ejecuten las operaciones
sobre los mismos datos
– conocer los rangos de rowid o de claves para dividir
el trabajo
– coordinar manualmente las sentencias que se
ejecutan en paralelo
• Con Parallel DML se ejecuta una sentencia
como una simple transacción sobre una única
sesión: el control de la atomicidad de la
transacción
7-5 es máximo (commit/rollback único)
Beneficios del PDML
• Alto grado de afinidad: Oracle usa el mapeo
partición-dispositivo
• Beneficios sobre tablas particionadas

Instancia 1 P99S1

P99S2
Instancia 2
P99ERR

7-6
Operaciones soportadas en
paralelo
• Consulta paralela (como en v7),
– soporta paralelismo dentro de una partición
• Nuevas opciones, paralelizadas por partición
(no hay paralelismo dentro de cada partición):
– INSERT... SELECT... con carga directa sobre
tablas particionadas
– DELETE sobre tablas particionadas
– UPDATE sobre tablas particionadas
– INSERT... SELECT... con carga directa sobre
7-7 tablas no particionadas
Tipos de paralelismo
• Las operaciones paralelas PE1
siempre tienen un proceso PE2
Maestro
maestro que coordina los
proceso esclavos PE3

• El tipo de operación determina cuándo y


cómo se paraleliza la operación
• Tres métodos de paralelización
– Por rangos de rowid (sólo consultas paralelas)
– Por procesos esclavos (INSERT en tablas no
particionadas)
7-8
– Por partición (sólo tablas particionadas)
Paralelización por rangos de
ROWID
• Se aplica a consultas de tablas particionadas y
no particionadas
• Proporciona paralelismo dentro de una
partición: varios procesos esclavo pueden estar
accediendo a una partición
PE1 AAAAT9AABAAABaIAAv
PE2 P99S1
AAAAT9AABAAABaLAAY
PE3 ...
PE4 P99S2
FFAAT9AABAAABaIAAv
PE5 P99ERR FFAAT9AABAAABaLAAY
7-9
PE6 ...
Paralelización por procesos esclavo
• Se aplica sólo en INSERT...SELECT... sobre
tablas no particionadas
• Como las nuevas filas no tienen ROWID, las
filas se distribuyen entre los procesos paralelos
que insertan en la tabla destino tras la HWM
INSERT /*+PARALLEL(TABLA1,3)*/ INTO TABLA2
SELECT * FROM TABLA1;

PQ1 PE1

Tabla1 PQ2 PE2 Tabla2


PQ3 PE3
7-10
Paralelización por particiones
• Se aplica sólo a tablas particionadas
• No hay paralelismo dentro de una partición
para operaciones DML
• Un proceso esclavo puede ser asignado a más
de una partición para compartir recursos
UPDATE /*+PARALLEL(PEDIDO,3)*/ PEDIDO
SET PENDIENTE = ’F’;

PE1 P99S1

PE2 P99S2

7-11
PE3 P99ERR
Comandos paralelos
Tipo de operación Paralelizado por
PARALLEL QUERY ROWID
PARALLEL INSERT... PARTICIÓN
SELECT... Direct Load
(tablas particionadas)
PARALLEL DELETE
PARTICIÓN
(tablas particionadas)
PARALLEL UPDATE
PARTICIÓN
(tablas particionadas)
PARALLEL INSERT...
PROCESOS ESCLAVO
SELECT... Direct Load
7-12 (tablas no partitionadas)
Parallel INSERT Direct Load
• Las filas se insertan en un segmento temporal
• El segmento temporal se añade luego al
segmento de datos por encima de la HWM
• Después, se asigna a cada fila un rowid y se
mueve la HWM (similar al SQL*Loader)
INSERT /*+PARALLEL(PEDIDO,3)*/ INTO PEDIDO
SELECT * FROM PEDIDOS_PENDIENTES;

PE1 P99S1
S. Temp. HWM
P99S2
PE2 S. Temp. HWM
P99ERR
7-13
PE3 S. Temp. HWM
Parallel DML: Activación
• Por defecto está desactivado, pudiéndose
hacer sólo consultas paralelas
• La sentencia ALTER SESSION que
permite la ejecución paralela de DML ha
de ser la primera de la transacción.
ALTER SESSION ENABLE PARALLEL DML;

• Cada operación PDML ha de terminar con


COMMIT o ROLLBACK (si no, error)
• En una transacción, tras una DML en serie
7-14
(salvo SELECT), se ignoran los hints o
cláusulas paralelas y se continua en serial
Parallel DML: Ejemplo
COMMIT;
ALTER SESSION ENABLE PARALLEL DML;
1 SELECT * FROM PEDIDO WHERE PENDIENTE = ’T’;
2 UPDATE PEDIDO SET PENDIENTE = ’F’;
3 INSERT /*+PARALLEL(PEDIDO,3)*/ INTO PEDIDO
SELECT * FROM PEDIDOS_PENDIENTES;
1. La sentencia SELECT puede ser ejecutada y no
afecta a la paralelización de la siguiente
2. La sentencia UPDATE se ejecuta en serie, por lo
que se ignora el hint paralelo del INSERT, que se
ejecutará también en serie
3. Si el UPDATE se hubiera ejecutado en paralelo, el
7-15
INSERT devolvería el error ORA-12830
Parallel DML: Desactivación
COMMIT;
ALTER SESSION DISABLE PARALLEL DML;
1 SELECT /*+PARALLEL(PEDIDO,3)*/ * FROM PEDIDO
WHERE PENDIENTE = ’T’;
2 UPDATE /*+PARALLEL(PEDIDO,3)*/ PEDIDO
SET PENDIENTE = ’F’;
3 COMMIT;
1. La sentencia SELECT puede ser ejecutada en paralelo
(parallel query)
2. El UPDATE se ejecuta en serie (PDML desactivado)
3. Con PDML activado, el UPDATE se hubiera ejecutado
en paralelo, y después siempre COMMIT/ROLLBACK
7-16
Cláusula PARALLEL
NOPARALLEL

PARALLEL ( DEGREE integer )


DEFAULT
INSTANCES integer
DEFAULT

• En las sentencias CREATE/ALTER, indica el


grado de paralelismo de sentencias DML
– DEGREE:el número de CPUs
– INSTANCES: nodos de base de datos distribuida
ALTER TABLE PEDIDO PARALLEL (DEGREE 4 INSTANCES 3);

• Los hints paralelos tienen preferencia sobre la


7-17
especificación de esta cláusula
Hints de PDML
UPDATE tabla
/*+ PARALLEL (m,n) */

DELETE FROM tabla


/*+ PARALLEL (m,n) */

INSERT INTO tabla


/*+ APPEND */
NOAPPEND
PARALLEL (m,n)

– El hint PARALLEL sustituyen los valores por defecto de


la cláusula PARALLEL para la definición de la tabla
– APPEND realiza la carga en modo directo (paralelizada)
– NOAPPEND realiza inserciones normales en modo serial
7-18
Grados de paralelismo
• El número ideal de procesos esclavos paralelos que
trabajan sobre una sentencia viene determinado por
los siguientes factores:
– Los valores DEGREE e INSTANCES especificados en la
cláusula PARALLEL o en el hint
– El número de CPUs de la máquina y de instancias
– El número de particiones a ser accedidas
– El mínimo valor del parámetro FREELISTS (listas de
transacciones libres) en la cláusula STORAGE de entre
todos los índices globales a ser actualizados
• El número real de procesos está limitado por la
disponibilidad de las instancias, y el mínimo se calcula
7-19
a partir del parámetro PARALLEL_MIN_PERCENT
SELECT paralelo
• Las consultas se paralelizan cuando:
– Hay un hint en la sentencia SELECT
– Se ha especificado la cláusula PARALLEL para la tabla
• Cuando se acceden a varias tablas, se elige de todas
ellas el hint o valores PARALLEL que definan un
mayor grado de paralelismo, como referencia para el
grado total de paralelismo de la consulta

7-20
INSERT...SELECT... paralelo
• Se pueden especificar hints para el INSERT y para el
SELECT, y ambas tablas pueden tener sus respectivas
cláusulas PARALLEL
• Cuatro factores pueden influenciar el paralelismo de
la sentencia entera, con esta preferencia:
– hint del INSERT
– cláusula PARALLEL de la tabla donde se inserta
– hint del SELECT
– máximo paralelismo definido en las clásulas PARALLEL de
las tablas que se consultan

7-21
INSERT...SELECT...: Ejemplo
INSERT /*+PARALLEL(PEDIDO,3)*/ INTO PEDIDO
SELECT /*+PARALLEL(PEDIDOS_PENDIENTES,5)*/ *
FROM PEDIDOS_PENDIENTES;

• Suponemos que se ha activado el PDML


• Basado en las reglas de preferencia, el grado de
paralelismo de la sentencia entera es 3

7-22
UPDATE y DELETE paralelo
• La sintaxis no cambia al añadir la posibilidad de
ejecución en paralelo
• El mismo paralelismo se aplica tanto para la consulta
previa la tabla como al realizar la actualización
• Si se definen subconsultas con sus propios hints y
cláusulas PARALLEL, estos no afectan a la
paralelización de la operación UPDATE/DELETE, ya
que esta decisión se toma independientemente de la
porción de consulta y viceversa
• Un UPDATE se paraleliza aunque la tabla se escanee
en modo serial
7-23
UPDATE/DELETE: Ejemplo
UPDATE /*+PARALLEL(PEDIDO,4)*/ PEDIDO
SET PENDIENTE = ’F’;

DELETE /*+PARALLEL(PEDIDO,4)*/ FROM PEDIDO


WHERE NUM_PED > 600;

• Suponemos que se ha activado el PDML


• Basado en las reglas de preferencia, el grado de
paralelismo de ambas sentencias es 4

7-24
Diccionario de datos
V$SESSION • El nuevo atributo de
SADDR V$SESSION es
SID
USERNAME
PMDL_ENABLED
SCHEMANAME que permite consultar
... si una sesión tiene
PDML_ENABLED
... habilitada el PDML

SELECT STATISTIC, LAST_QUERY, SESSION_TOTAL


FROM V$PQ_SESSTAT WHERE STATISTIC = ’DML Parallelized’;
SELECT STATISTIC, VALUE
FROM V$PQ_SYSSTAT WHERE STATISTIC = ’DML Initiated’;

• Se han añadido nuevas filas a V$PQ_SESSTAT


7-25 para consultar las sentencias PDML
Opción LOGGING/NOLOGGING
• Es posible desactivar el uso de redo log para ciertas
operaciones paralelas, como INSERT...SELECT...
para reducir el tiempo de proceso de la sentencia
• Se especifica a nivel del objeto (no de la sentencia)
ALTER TABLE PEDIDO NOLOGGING;

• A nivel de tablespace, determina el valor por defecto


para los objetos allí creados

7-26
PDML y segmentos de rollback
UPDATE /*+PARALLEL(PEDIDO,4)*/ PEDIDO
SET PENDIENTE = ’F’;

PE1 PE2 PE3 PE4

RS1 RS2 RS3

• Cada proceso esclavo es tratado como una transacción independiente


• La atomicidad de la transacción original se consigue con un
mecanismo de commit en dos fases que valida los cambios realizados
por los procesos esclavos
• Con PDML no se admite el uso de la sentencia SET TRANSACTION
7-27
USE ROLLBACK SEGMENT, así que no se puede controlar qué
segmento de rollback se asigna a cada proceso esclavo
Restricciones generales
• Cada operación PDML deben ser validada después de su
ejecución, con un COMMIT o un ROLLBACK
• El soporte de las restricciones es limitado:
– si alguna se viola, la sentencia se ejecuta en serial (no da error)
– no se permiten: claves ajenas reflexivas, integridad referencial
ON DELETE CASCADE, ni integridad diferida
• No se permite:
– PDML con LOCK TABLE o SELECT FOR UPDATE en la
misma transacción, porque PDML realiza bloqueos exclusivos
– PDML sobre índices bitmap, tablas con LOB o tipos de objeto,
tablas clusterizadas o con triggers activados
– INSERT paralelo sobre índices globales (evita auto-deadlocks)
7-28
– UPDATE paralelo sobre índices globales únicos
Recuperación en PDML
• Recuperación de transacción
– Tras un fallo de una transacción PDML, SMON recupera en
modo serial; mientras tanto, los recursos quedan bloqueados
– Para acelerar este proceso, se puede volver a ejecutar la
sentencia PDML y después hacer COMMIT o ROLLBACK
• Recuperación de proceso
– Tras un fallo en un proceso esclavo, PMON hace rollback del
trabajo de ese proceso, y otro proceso esclavo hace rollback de
la operación completa
– Si fallan varios procesos esclavos, PMON cancela la operación
completa de forma serial
– Si el proceso maestro falla, el PMON lo recupera y todos los
procesos esclavos hacen rollback
7-29
• El ROLLBACK normal se realiza en paralelo
Resumen
• El paralelismo acelera las grandes operaciones
DML sobre grandes tablas e índices
• Es fácil de usar, definiendo la cláusula
PARALLEL a nivel de objeto, o con los hits para
cada sentencia
• La afinidad es gestionada por el servidor
• El servidor también controla las transacciones
• Hay que tener cuidado con las restricciones

7-30

S-ar putea să vă placă și