Administer, Manage and Tune Parallel Execution

1. Documentación en Tahiti -> Masters Book List -> VLDB and Partitioning Guide -> 8 Using Parallel Execution -> Tuning General Parameters for Parallel Execution

2. En el objetivo de «Configure and use parallel execution for queries» hemos visto cómo configurar PX de varias formas y también hemos utililizado varios parámetros para ello. Ahora entiendo que nos piden qué sepamos todos los parámetros que afectan a PX y sepamos utilizarlos.

3. Veamos la lista de parámetros completa qué podemos usar y afectan a PX.

PARÁMETRO                       POR DEFECTO                COMENTARIOS
------------------------------- -------------------------- -----------------------------------------------------------------------
PARALLEL_ADAPTIVE_MULTI_USER    TRUE                       Reduce el DOP para prevenir saturación en el sistema
PARALLEL_DEGREE_LIMIT           CPU_COUNT X                Controla el máximo DOP que puede tener una sentencia
                                PARALLEL_THREADS_PER_CPU X
                                Número de Instancias
PARALLEL_DEGREE_POLICY          MANUAL                     Determina la política para calcular DOP (MANUAL, LIMITED o AUTO)
PARALLEL_EXECUTION_MESSAGE_SIZE 16KB                       El tamaño de los buffers que utilizan los PX Servers
PARALLEL_FORCE_LOCAL            FALSE                      Permite forzar PX a la instancia local en RAC
PARALLEL_MAX_SERVERS            PARALLEL_THREADS_PER_CPU X Máximo número de procesos Parallel Servers
                                1|2|4 (NO MM|PGAMM|ASMM) X
                                5 (Valor fijo)
PARALLEL_MIN_SERVERS            0                          Controla el número de procesos PX que arrancan a la iniciar la BD
PARALLEL_MIN_PERCENT            0                          Porcentaje de procesos PX que tienen que estar libres para comenzar
                                                           la sentencia. Si no hay suficientes puede producirse el error ORA-12827
PARALLEL_MIN_TIME_THRESHOLD     10                         Tiempo mínimo de ejecución de una consulta para poder valor PX
PARALLEL_SERVERS_TARGET         PARALLEL_THREADS_PER_CPU X Controla el número de procesos PX disponibles antes de usar Queueing
                                1|2|4 (NO MM|PGAMM|ASMM) X
                                2 (Valor fijo)
PARALLEL_THREADS_PER_CPU        2                          Número de procesos PX por THREAD (o instancia) en RAC
SHARED_POOL_SIZE                Depende de varios factores Cuando utilicemos PX es recomendable ampliar este parámetro (Ver doc.)
                                                           En nuestro caso utilizamos AMM así que no nos preocupamos por ello

4. Existen otros parámetro que afectan o están relacionados con PX (FAST_START_PARALLEL_ROLLBACK, DML_LOCKS, etc…). Es recomendable leer la documentación referencia al comienzo del objetivo para conocer las implicaciones que tienen con PX.

5. Para monitorizar el rendimiento de PX tenemos una serie de vistas que nos pueden aportar bastante información. La lista completa con las descripciones la tenemos en la Documentación Oficial. Listamos y resumimos para que se utiliza cada una de ellas.

· V$PX_BUFFER_ADVICE: Proporciona estadísticas acerca de los Buffers de PX. Útil para redimensionar la SGA.
· V$PX_SESSION: Información acerca de las sesiones, DEGREE, …
· V$PX_SESSTAT: Información cruzada entre V$PX_SESSION y V$SESSTAT
· V$PX_PROCESS: Información acerca de los procesos PX
· V$PX_PROCESS_SYSSTAT: Información acerca de los procesos PX con estadísticas sobre los buffers
· V$PQ_SESSTAT: Estadísticas acerca de la ejecución de consulta con PX. Útil para ajustar ciertos parámetros.
· V$PQ_TQSTAT: Información del tráfico de mensajes a nivel de colas de cada proceso PX

-- Mostramos información de las sesiones y el grado de DOP que se está utilizando.
SELECT QCSID, SID, INST_ID "Inst", SERVER_GROUP "Group", SERVER_SET "Set",
  DEGREE "Degree", REQ_DEGREE "Req Degree"
FROM GV$PX_SESSION ORDER BY QCSID, QCINST_ID, SERVER_GROUP, SERVER_SET;

-- Consultamos el estado de los procesos PX
SELECT * FROM V$PX_PROCESS;

Las siguientes vistas son útiles cuando aplicamos el Resource Manager para controlador el grado de paralelización. De momento no lo vamos a prácticar porque ya tenemos un objetivo completo con el Resource Manager en la sección de «Performance Management».

· V$RSRC_CONS_GROUP_HISTORY
· V$RSRC_CONSUMER_GROUP
· V$RSRC_PLAN
· V$RSRC_PLAN_HISTORY
· V$RSRC_SESSION_INFO

6. Un posible ejemplo que podemos realizar de tuning de PX es calcular el tamaño adicional de memoria que estamos manejando en nuestra instancia para evaluar si debemos ampliar la memoria o no.

-- Calculamos el número de buffers que estamos utilizando en estos momentos (Buffers HWM)
--   STATISTIC                           VALUE
--   ------------------------------ ----------
--   Buffers Allocated                     376
--   Buffers Freed                         376
--   Buffers Current                         0
--   Buffers HWM                           107
SELECT * FROM V$PX_PROCESS_SYSSTAT WHERE STATISTIC LIKE 'Buffers%';

-- Obtenemos el tamaño del Buffer
--   NAME                                 TYPE        VALUE
--   ------------------------------------ ----------- ------------------------------
--   parallel_execution_message_size      integer     16384
SHOW PARAMETER PARALLEL_EXECUTION_MESSAGE_SIZE

-- Obtenemos el tamaño actual dedicado a PX
--   POOL         NAME                            BYTES
--   ------------ -------------------------- ----------
--   large pool   PX msg pool                   8192000
SELECT POOL,NAME,BYTES FROM V$SGASTAT WHERE NAME = 'PX msg pool';

Para calcular el tamaño multiplicamos el valor de «Buffers HWM» * PARALLEL_EXECUTION_MESSAGE_SIZE = 107 * 16K = 1.7MB. El tamaño dedicado de memoria para PX es de 8MB, que es bastante superior a lo que estamos utilizando, por lo que no tendríamos que realizar acción alguna. Además hay que tener en cuenta que estamos usando la gestión automática de memoria (AMM), luego si es necesario, el tamaño de la SGA aumentaría para ampliar este pool. Si vemos que nuestro sistema utiliza bastante memoria para PX, podemos evaluar la necesidad de aumentar el tamaño total de la memoria y/o subir el mínimo dedicado a la SGA para evitar operaciones de ampliación (parámetros MEMORY_TARGET, SGA_TARGET y SHARED_POOL_SIZE).