# Oracle Parallel Query: Aprovechando todo el poder de tu servidor

Level200

Durante años, el crecimiento de las bases de datos ha superado la capacidad de una sola CPU para procesar información de manera eficiente, tablas con cientos de millones de registros, procesos ETL masivos y reportes corporativos cada vez más exigentes obligan a Oracle a buscar una estrategia diferente: dividir el trabajo y conquistar el problema en paralelo.

Oracle Parallel Execution permite que múltiples procesos trabajen simultáneamente sobre una misma tarea, transformando operaciones que podrían tardar horas en procesos que concluyen en minutos o incluso segundos; pero ¿cómo funciona realmente? ¿Cuándo vale la pena utilizarlo? ¿Y qué impacto tiene sobre los recursos del servidor?

En este artículo exploraremos el paralelismo desde una perspectiva práctica.

¿Y como decide Oracle el paralelismo?

*   Numero de cpu disponibles
    
*   Cores por cpu
    
*   threads por core
    
*   Parametros de BD
    
*   Carga del server
    
*   Objeto involucrado
    
*   Grado solicitado
    
*   I/O
    

Como vemos los cpus que oracle considera disponibles:

> SHOW PARAMETER cpu\_count;

![](https://cdn.hashnode.com/uploads/covers/6a1ba5f97c924da4619cfa34/4537c945-024d-470e-a0f7-4fbe24dc05a6.png align="center")

Que parámetros son importantes para el paralelismo:

**PARALLEL\_DEGREE\_POLICY** \= *MODE, por defecto tiene el modo manual, seteado a AUTO oracle habilita el grado de paralelismo automático (DOP).*

*\*\*Para usar auto DOP requiere que el DBA tune y balancee las necesidades de paralelismo contra los recursos disponibles. I/O Calibration estadísticas debe existir cuando se usa auto DOP.*

![](https://cdn.hashnode.com/uploads/covers/6a1ba5f97c924da4619cfa34/7323d209-2fb4-4a65-8afd-d62aa3fbb6bf.png align="center")

**PARALLEL\_MAX\_SERVERS**  = *PARALLEL\_THREADS\_PER\_CPU CPU\_COUNT concurrent\_parallel\_users \* 5*

*Oracle calcula este valor basado en esta formula, setear a un valor muy alto puede afectar durante periodos de picos de consumo.*

![](https://cdn.hashnode.com/uploads/covers/6a1ba5f97c924da4619cfa34/cc346467-e812-4756-8eed-1ff2d160be08.png align="center")

**PARALLEL\_THREADS\_PER\_CPU** = *Operating system-dependent, usually 2*   .

Utilice siempre el valor predeterminado.

![](https://cdn.hashnode.com/uploads/covers/6a1ba5f97c924da4619cfa34/cc81db86-0163-48b7-87c7-b849dca3121f.png align="center")

**PARALLEL\_MIN\_SERVERS** = 0

Oracle apagará los servidores paralelos después de que hayan estado inactivos durante un período de tiempo. Este parámetro controla ese comportamiento, cuando el valor de este parámetro no es cero la base de datos inicia los procesos al iniciar la instancia y estos permanecen disponibles hasta que se apaga la instancia.

![](https://cdn.hashnode.com/uploads/covers/6a1ba5f97c924da4619cfa34/74f1357d-16d1-4476-9094-820056419296.png align="center")

**PARALLEL\_MIN\_DEGREE** = 1

Controla el mínimo grado de paralelismo por DOP.

![](https://cdn.hashnode.com/uploads/covers/6a1ba5f97c924da4619cfa34/6be7bb85-1196-4908-ac75-e2f8e1de1b0a.png align="center")

**PARALLEL\_DEGREE\_LIMIT** = *CPU*

Se utiliza únicamente si PARALLEL\_DEGREE\_POLICY está configurado como AUTO o LIMITED. Este parámetro establece el grado máximo de paralelismo que pueden utilizar todas las instrucciones ejecutadas en paralelo.

Cuando se establece en CPU, el grado máximo de paralelismo de una instrucción se limita al número de CPU del sistema.

![](https://cdn.hashnode.com/uploads/covers/6a1ba5f97c924da4619cfa34/fa0c4be4-d864-4719-be3d-52bf4b30fcbd.png align="center")

\*\*\*Estos parámetros fueron obtenidos de la nota **KB82443**(Setup, Monitor, And Tune Parallelism In The Database) de Oracle Support**.**

**Donde se define el paralelismo?**

El paralelismo se puede definir a nivel de instancia, objeto o sentencia SQL.

Ahora veamos el paralelismo en acción:

![](https://cdn.hashnode.com/uploads/covers/6a1ba5f97c924da4619cfa34/747f62f1-458a-4022-a1f7-ea39991d1e4a.png align="center")

![](https://cdn.hashnode.com/uploads/covers/6a1ba5f97c924da4619cfa34/f5715827-b589-4593-bad0-25f449a2c65c.png align="center")

\*\*Vemos que por el hint se esta usando el paralelismo.

\*\*Veamos el grado de paralelismo que tiene la tabla:

> SELECT owner, table\_name, degree
> 
> FROM dba\_tables WHERE table\_name='VENTAS';

![](https://cdn.hashnode.com/uploads/covers/6a1ba5f97c924da4619cfa34/a61e7017-f178-442a-a2e4-14b347e34ec5.png align="center")

\*\*Como podemos validar cuales son los procesos paralelos:

> SELECT sid, serial#, server\_group, server\_set, degree, req\_degree
> 
> FROM v$px\_session;

![](https://cdn.hashnode.com/uploads/covers/6a1ba5f97c924da4619cfa34/8e965386-f4c9-4305-8ab1-441706d52b93.png align="center")

\*\*Si queremos ver el detalle de los procesos:

> SELECT sid, server\_name, status
> 
> FROM gv$px\_process;

![](https://cdn.hashnode.com/uploads/covers/6a1ba5f97c924da4619cfa34/df484b18-4da9-4982-b6f7-5e1b8c7f06fe.png align="center")

\*\*\*Y como se ve cuando me quedo sin capacidad:

![](https://cdn.hashnode.com/uploads/covers/6a1ba5f97c924da4619cfa34/53ce4731-4c7b-4c0f-9f2d-fee4c89a243d.png align="center")

A nivel de sistema operativo no tengo cpu disponible, id=0%.

![](https://cdn.hashnode.com/uploads/covers/6a1ba5f97c924da4619cfa34/4f5237b5-4200-437f-a374-e37abd914a3a.png align="center")

Oracle no puede entregarme los procesos paralelos que pido, en el query pido 16 y en algunos casos solo me da 4.

**Donde se recomienda usar el paralelismo?**

*   Querys que realizan largos table scans, joins, or particionados index scans.
    
*   Creación de indices grandes.
    
*   Creación de tablas grandes incluido vistas materializadas.
    
*   Bulk inserts, updates , merges y borrados.
    

**Cuando no debemos usar paralelismo?**

*   Entornos donde los querrás típicos o transacciones son muy cortos, dado que eso puede empeorar el tiempo de respuesta.
    
*   Entornos en el cual cpu, memoria e i/o recursos son altamente usados.
    

**Conclusión:**

Oracle Parallel Execution puede reducir drásticamente los tiempos de procesamiento al distribuir el trabajo entre múltiples CPUs, pero no todas las cargas se benefician de esta estrategia. Un grado de paralelismo excesivo puede generar sobrecarga, competencia por recursos y una menor eficiencia general del sistema, la clave no es usar más paralelismo, sino encontrar el nivel adecuado para cada carga de trabajo.
