Oracle 10 g  Tuning Oracle Parallel Query (OPQ) y Particionamiento de Tablas Juan Sánchez – jsancheznav@gmail.com
Objetivos <ul><li>Visión General </li></ul><ul><li>Parámetros de Inicialización </li></ul><ul><li>Partido de tablas </li><...
<ul><li>Oracle Parallel Query </li></ul><ul><li>Partición de una consulta entre n CPUs </li></ul><ul><li>Recomendado en op...
<ul><li>SQL    DML y SELECT </li></ul><ul><li>Se ejecuta un proceso coordinador +  ( n procesos * grado paralelismo) </li...
<ul><li>Generación del proceso coordinador </li></ul><ul><li>Subdivisión del trabajo en unidades </li></ul><ul><li>Petició...
<ul><li>Oracle mantiene un pool de procesos esclavos </li></ul><ul><li>Un proceso esclavo solo puede estar asignado a una ...
<ul><li>Nº CPUs   </li></ul><ul><ul><li>Si Grado Paralelismo<Nº CPU    Esperas!!! </li></ul></ul><ul><ul><li>Siempre exis...
<ul><li>1 CPU y paralelizado activado </li></ul><ul><ul><li>Buena idea si CPU tiene que esperar por E/S mientras que el ot...
<ul><li>División registros tablas en diferentes datafiles según criterios arbitrarios </li></ul><ul><li>Una tabla particio...
<ul><li>¿Por qué particionar? </li></ul><ul><ul><li>Mejora del rendimiento    Ejemplo muy básico Tablas e Índices en tabl...
<ul><li>Se puede particionar una o más columnas </li></ul><ul><li>Cada partición tiene asignada una Partition Key (columna...
Una tabla sin particionar <> Una tabla con 1 partición Juan Sánchez – jsancheznav@gmail.com Particionamiento de tablas
<ul><li>Limitaciones </li></ul><ul><ul><li>Un registro solo puede pertenecer a una partición </li></ul></ul><ul><ul><li>No...
<ul><li>Part. según  RANGO de VALORES </li></ul><ul><ul><li>Division registro según &quot;condición&quot;    p.e. Año de ...
<ul><li>Ejemplo Rango de datos </li></ul><ul><ul><li>CREATE TABLE TABLA_PART </li></ul></ul><ul><ul><li>( </li></ul></ul><...
<ul><li>Part. según  LISTA de VALORES </li></ul><ul><ul><li>Division registro según &quot;condición&quot;    p.e. Tipo de...
<ul><li>Ejemplo Lista de valores </li></ul><ul><ul><li>CREATE TABLE TABLA_PART </li></ul></ul><ul><ul><li>( </li></ul></ul...
<ul><li>Part. según  HASHING </li></ul><ul><ul><li>Se calcula hash de un conjunto de columnas </li></ul></ul><ul><ul><li>S...
<ul><li>Ejemplo Lista de valores </li></ul><ul><ul><li>CREATE TABLE TABLA_PART </li></ul></ul><ul><ul><li>( </li></ul></ul...
<ul><li>Ejemplo Lista de valores </li></ul>Juan Sánchez – jsancheznav@gmail.com Particionamiento de tablas
<ul><li>Atención a Invalidación de indices si en tabla: </li></ul><ul><ul><li>COALESCE </li></ul></ul><ul><ul><li>DROP </l...
<ul><li>Métodos de particionado </li></ul><ul><ul><li>Local </li></ul></ul><ul><ul><ul><li>Misma estructura que sus tablas...
<ul><li>Oracle controla nivel paralelismo </li></ul><ul><li>Se puede obligar mediante: </li></ul><ul><ul><li>Hints de para...
<ul><li>Desactivar en una tabla paralelizada </li></ul><ul><ul><ul><li>SQL> alter table mitabla parallel (degree 1 instanc...
Juan Sánchez – jsancheznav@gmail.com Parámetros Sistema Nº máximo de ejecuciones en paralelo Si valor bajo posiblemente DM...
Juan Sánchez – jsancheznav@gmail.com Parámetros Sistema <ul><li>Si TRUE: </li></ul><ul><ul><li>Mejora rendimiento en entor...
Juan Sánchez – jsancheznav@gmail.com Parámetros Ocultos Sistema SELECT a.ksppinm  &quot;Parameter&quot;, a.ksppdesc &quot;...
<ul><li>Vistas </li></ul><ul><ul><li>v_$pq_sysstat; </li></ul></ul><ul><ul><li>v_$px_process; </li></ul></ul><ul><ul><li>v...
<ul><li>Tomar snapshot con statspack </li></ul><ul><li>Realizar consulta </li></ul><ul><ul><li>select to_char(snap_time,'y...
<ul><li>Datapump </li></ul><ul><ul><li>expdp </li></ul></ul><ul><ul><li>impdp </li></ul></ul><ul><li>Replicación </li></ul...
Upcoming SlideShare
Loading in …5
×

Oracle Tuning Opq

5,421 views

Published on

Introducción a las consultas en Paralelo y Tablas particionadas

Published in: Education
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
5,421
On SlideShare
0
From Embeds
0
Number of Embeds
23
Actions
Shares
0
Downloads
103
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Oracle Tuning Opq

  1. 1. Oracle 10 g Tuning Oracle Parallel Query (OPQ) y Particionamiento de Tablas Juan Sánchez – jsancheznav@gmail.com
  2. 2. Objetivos <ul><li>Visión General </li></ul><ul><li>Parámetros de Inicialización </li></ul><ul><li>Partido de tablas </li></ul><ul><li>Uso de OPQ </li></ul><ul><li>Ejemplos </li></ul>Juan Sánchez – jsancheznav@gmail.com
  3. 3. <ul><li>Oracle Parallel Query </li></ul><ul><li>Partición de una consulta entre n CPUs </li></ul><ul><li>Recomendado en operaciones: </li></ul><ul><ul><li>FTS en tablas Grandes </li></ul></ul><ul><ul><li>Ordenaciones </li></ul></ul><ul><ul><li>Subconsultas </li></ul></ul><ul><ul><li>Carga de datos </li></ul></ul><ul><li>Entornos: Decission Suport + Data Warehouse </li></ul>Juan Sánchez – jsancheznav@gmail.com Visión General
  4. 4. <ul><li>SQL  DML y SELECT </li></ul><ul><li>Se ejecuta un proceso coordinador + ( n procesos * grado paralelismo) </li></ul>Juan Sánchez – jsancheznav@gmail.com Visión General
  5. 5. <ul><li>Generación del proceso coordinador </li></ul><ul><li>Subdivisión del trabajo en unidades </li></ul><ul><li>Petición de procesos esclavos </li></ul><ul><li>Asignación procesos esclavos a unidades trab </li></ul><ul><li>Recolección y combinación de los resultados </li></ul><ul><li>Devolución resultado conjunto </li></ul><ul><li>Liberación procesos esclavos </li></ul>Juan Sánchez – jsancheznav@gmail.com ¿Cómo funciona?
  6. 6. <ul><li>Oracle mantiene un pool de procesos esclavos </li></ul><ul><li>Un proceso esclavo solo puede estar asignado a una instrucción SQL </li></ul><ul><li>Al finalizar la instrucción se libera el proc.esc. </li></ul><ul><li>PARALLEL_MIN_SERVERS, PARALLEL_MAX_SERVERS </li></ul><ul><li>Cada proceso esclavo tiene su propia area de memoria </li></ul>Juan Sánchez – jsancheznav@gmail.com Procesos esclavos
  7. 7. <ul><li>Nº CPUs </li></ul><ul><ul><li>Si Grado Paralelismo<Nº CPU  Esperas!!! </li></ul></ul><ul><ul><li>Siempre existe un proceso coordinador </li></ul></ul><ul><li>Nº Discos donde se almacena tabla </li></ul><ul><ul><li>Si Grado Paralelismo>Nº discos  Esperas!!! </li></ul></ul>Juan Sánchez – jsancheznav@gmail.com Rendimiento depende de …
  8. 8. <ul><li>1 CPU y paralelizado activado </li></ul><ul><ul><li>Buena idea si CPU tiene que esperar por E/S mientras que el otro hilo puede continuar </li></ul></ul><ul><ul><li>PARALLEL_MAX_SERVERS entre 2 y 4 </li></ul></ul><ul><li>Sobreuso de la paralelización </li></ul><ul><ul><li>Saturación de recursos </li></ul></ul>Juan Sánchez – jsancheznav@gmail.com Notas importantes
  9. 9. <ul><li>División registros tablas en diferentes datafiles según criterios arbitrarios </li></ul><ul><li>Una tabla particionada puede estar contenida en 1 o más datafiles </li></ul><ul><li>Cada una de las particiones puede ser accedida en paralelo </li></ul>Juan Sánchez – jsancheznav@gmail.com Particionamiento de tablas Partición 1 tabla Partición 2 Partición 3 Posible Paralelización DML / Select
  10. 10. <ul><li>¿Por qué particionar? </li></ul><ul><ul><li>Mejora del rendimiento  Ejemplo muy básico Tablas e Índices en tablespaces diferentes </li></ul></ul><ul><ul><li>Adaptación del almacenamiento al contenido de datos de la tabla </li></ul></ul><ul><ul><li>RMAN más eficiente </li></ul></ul><ul><ul><li>CBO utiliza OPQ </li></ul></ul><ul><ul><li>Uso másivo de las CPUs </li></ul></ul>Juan Sánchez – jsancheznav@gmail.com Particionamiento de tablas
  11. 11. <ul><li>Se puede particionar una o más columnas </li></ul><ul><li>Cada partición tiene asignada una Partition Key (columnas seleccionadas) </li></ul><ul><li>Métodos de particionado </li></ul><ul><ul><li>Rango de valores </li></ul></ul><ul><ul><li>Valores de una lista </li></ul></ul><ul><ul><li>Column Hashing </li></ul></ul><ul><ul><li>Combinados  Rango+Hash o Rango+List </li></ul></ul>Juan Sánchez – jsancheznav@gmail.com Particionamiento de tablas
  12. 12. Una tabla sin particionar <> Una tabla con 1 partición Juan Sánchez – jsancheznav@gmail.com Particionamiento de tablas
  13. 13. <ul><li>Limitaciones </li></ul><ul><ul><li>Un registro solo puede pertenecer a una partición </li></ul></ul><ul><ul><li>No se puede partir una tabla que es parte de un cluster </li></ul></ul><ul><ul><li>Número máximo de particiones 1024K-1 </li></ul></ul><ul><ul><li>No se puede partir una tabla que contiene columnas LONG or LONG RAW </li></ul></ul>Juan Sánchez – jsancheznav@gmail.com Particionamiento de tablas
  14. 14. <ul><li>Part. según RANGO de VALORES </li></ul><ul><ul><li>Division registro según &quot;condición&quot;  p.e. Año de Fecha </li></ul></ul><ul><ul><li>Valor condicional es dinámico </li></ul></ul><ul><ul><li>Tener en cuenta valor &quot;fuera de rango&quot; </li></ul></ul><ul><ul><li>Atención a DML </li></ul></ul>Juan Sánchez – jsancheznav@gmail.com Particionamiento de tablas
  15. 15. <ul><li>Ejemplo Rango de datos </li></ul><ul><ul><li>CREATE TABLE TABLA_PART </li></ul></ul><ul><ul><li>( </li></ul></ul><ul><ul><li>COLUMN1 VARCHAR2(20) NOT NULL, COLUMN2 DATE, </li></ul></ul><ul><ul><li>CONSTRAINT TABLA_PARTICIONADA_PK PRIMARY KEY </li></ul></ul><ul><ul><li>( COLUMN1 ) </li></ul></ul><ul><ul><li>) </li></ul></ul><ul><ul><li>TABLESPACE &quot;USERS&quot; </li></ul></ul><ul><ul><li>PARTITION BY RANGE(COLUMN2) </li></ul></ul><ul><ul><li>( </li></ul></ul><ul><ul><li>PARTITION PART VALUES LESS THAN( to_date( '2010-01-01','YYYY-MM-DD')) </li></ul></ul><ul><ul><li>TABLESPACE &quot;EXAMPLE&quot;, </li></ul></ul><ul><ul><li>PARTITION PART2 VALUES LESS THAN( MAXVALUE ) </li></ul></ul><ul><ul><li>TABLESPACE &quot;USERS&quot; </li></ul></ul><ul><ul><li>); </li></ul></ul><ul><ul><li>INSERT INTO TABLA_PART VALUES('A',TO_DATE('2010-01-01','YYYY-MM-DD')); </li></ul></ul><ul><ul><li>INSERT INTO TABLA_PART VALUES('B',TO_DATE('2009-01-01','YYYY-MM-DD')); </li></ul></ul><ul><ul><li>COMMIT; </li></ul></ul><ul><ul><li>SELECT * FROM DBA_EXTENTS WHERE segment_name='TABLA_PART'; </li></ul></ul>Juan Sánchez – jsancheznav@gmail.com Particionamiento de tablas
  16. 16. <ul><li>Part. según LISTA de VALORES </li></ul><ul><ul><li>Division registro según &quot;condición&quot;  p.e. Tipo de Cliente </li></ul></ul><ul><ul><li>Valor condicional es fijo  Foreign Key </li></ul></ul><ul><ul><li>Tener en cuenta valor &quot;fuera de rango&quot; </li></ul></ul>Juan Sánchez – jsancheznav@gmail.com Particionamiento de tablas
  17. 17. <ul><li>Ejemplo Lista de valores </li></ul><ul><ul><li>CREATE TABLE TABLA_PART </li></ul></ul><ul><ul><li>( </li></ul></ul><ul><ul><li>COLUMN1 VARCHAR2(20) NOT NULL, COLUMN2 VARCHAR2(2), </li></ul></ul><ul><ul><li>CONSTRAINT TABLA_PARTICIONADA_PK PRIMARY KEY </li></ul></ul><ul><ul><li>( COLUMN1 ) </li></ul></ul><ul><ul><li>) </li></ul></ul><ul><ul><li>TABLESPACE &quot;USERS&quot; </li></ul></ul><ul><ul><li>PARTITION BY LIST(COLUMN2) </li></ul></ul><ul><ul><li>( </li></ul></ul><ul><ul><li>PARTITION PART VALUES ('ES') TABLESPACE &quot;EXAMPLE&quot;, </li></ul></ul><ul><ul><li>PARTITION PART2 VALUES ( DEFAULT ) TABLESPACE &quot;USERS&quot; </li></ul></ul><ul><ul><li>); </li></ul></ul><ul><ul><li>INSERT INTO TABLA_PART VALUES('A','ES'); </li></ul></ul><ul><ul><li>INSERT INTO TABLA_PART VALUES('B','FR'); </li></ul></ul><ul><ul><li>COMMIT; </li></ul></ul><ul><ul><li>SELECT * FROM DBA_EXTENTS WHERE segment_name='TABLA_PART'; </li></ul></ul>Juan Sánchez – jsancheznav@gmail.com Particionamiento de tablas
  18. 18. <ul><li>Part. según HASHING </li></ul><ul><ul><li>Se calcula hash de un conjunto de columnas </li></ul></ul><ul><ul><li>Se puede asignar como conjunto </li></ul></ul><ul><ul><li>Limitaciones: </li></ul></ul><ul><ul><ul><li>Máximo 16 columnas </li></ul></ul></ul><ul><ul><ul><li>ROWID, UROWID no permitidos </li></ul></ul></ul><ul><ul><ul><li>LONG, LOB no permitidos </li></ul></ul></ul><ul><ul><li>Mejor rendimiento  nºparticiones potencia de 2 </li></ul></ul>Juan Sánchez – jsancheznav@gmail.com Particionamiento de tablas
  19. 19. <ul><li>Ejemplo Lista de valores </li></ul><ul><ul><li>CREATE TABLE TABLA_PART </li></ul></ul><ul><ul><li>( </li></ul></ul><ul><ul><li>COLUMN1 VARCHAR2(20) NOT NULL, COLUMN2 VARCHAR2(2), </li></ul></ul><ul><ul><li>CONSTRAINT TABLA_PARTICIONADA_PK PRIMARY KEY </li></ul></ul><ul><ul><li>( COLUMN1 ) </li></ul></ul><ul><ul><li>) </li></ul></ul><ul><ul><li>TABLESPACE &quot;USERS&quot; </li></ul></ul><ul><ul><li>PARTITION BY HASH(COLUMN2) PARTITIONS 4 </li></ul></ul><ul><ul><li>STORE IN (TABSP1,TABSP2,TABSP3,TABSP4) </li></ul></ul><ul><ul><li>; </li></ul></ul><ul><ul><li>INSERT INTO TABLA_PART VALUES('A','ES'); </li></ul></ul><ul><ul><li>INSERT INTO TABLA_PART VALUES('B','FR'); </li></ul></ul><ul><ul><li>COMMIT; </li></ul></ul><ul><ul><li>SELECT * FROM DBA_EXTENTS WHERE segment_name='TABLA_PART'; </li></ul></ul>Juan Sánchez – jsancheznav@gmail.com Particionamiento de tablas
  20. 20. <ul><li>Ejemplo Lista de valores </li></ul>Juan Sánchez – jsancheznav@gmail.com Particionamiento de tablas
  21. 21. <ul><li>Atención a Invalidación de indices si en tabla: </li></ul><ul><ul><li>COALESCE </li></ul></ul><ul><ul><li>DROP </li></ul></ul><ul><ul><li>EXCHANGE </li></ul></ul><ul><ul><li>MERGE </li></ul></ul><ul><ul><li>MOVE </li></ul></ul><ul><ul><li>SPLIT </li></ul></ul><ul><ul><li>TRUNCATE </li></ul></ul>Juan Sánchez – jsancheznav@gmail.com Particionamiento de tablas
  22. 22. <ul><li>Métodos de particionado </li></ul><ul><ul><li>Local </li></ul></ul><ul><ul><ul><li>Misma estructura que sus tablas particionadas </li></ul></ul></ul><ul><ul><ul><li>Mejor opción debido a mnto automático </li></ul></ul></ul><ul><ul><li>Global Index </li></ul></ul><ul><ul><ul><li>ïndices con estructura diferente de tablas part </li></ul></ul></ul><ul><ul><ul><li>Exigen mantenimiento manual </li></ul></ul></ul><ul><ul><ul><li>Un índice cubre todas las particiones </li></ul></ul></ul>Juan Sánchez – jsancheznav@gmail.com Particionamiento de índices
  23. 23. <ul><li>Oracle controla nivel paralelismo </li></ul><ul><li>Se puede obligar mediante: </li></ul><ul><ul><li>Hints de paralelización </li></ul></ul><ul><ul><ul><li>SQL> select /*+ FULL(employee_table) PARALLEL(employee_table, 2) */ </li></ul></ul></ul><ul><ul><ul><ul><li>employee_name </li></ul></ul></ul></ul><ul><ul><ul><ul><li>from employee_table where salary > 10000; </li></ul></ul></ul></ul><ul><ul><li>Modificar el nivel de paralelismo de la tabla </li></ul></ul><ul><ul><ul><li>SQL> select degree from user_tables </li></ul></ul></ul><ul><ul><ul><li>SQL> CREATE TABLE TABLA1 (COL1 VARCHAR2(20)) PARALLEL 2; </li></ul></ul></ul>Juan Sánchez – jsancheznav@gmail.com Obligar paralelismo
  24. 24. <ul><li>Desactivar en una tabla paralelizada </li></ul><ul><ul><ul><li>SQL> alter table mitabla parallel (degree 1 instances 1); </li></ul></ul></ul><ul><ul><ul><li>SQL> alter table mitabla noparallel; </li></ul></ul></ul><ul><li>Desactivar en un índice paralelizado </li></ul><ul><ul><ul><li>SQL> alter index miindice parallel (degree 1 instances 1); </li></ul></ul></ul><ul><ul><ul><li>SQL> alter index miindice noparallel; </li></ul></ul></ul>Juan Sánchez – jsancheznav@gmail.com Desactivar paralelismo
  25. 25. Juan 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_servers Nº minimo de ejecuciones en paralelo parallel_min_servers <ul><li>Si TRUE: </li></ul><ul><ul><li>Gestión automática por Oracle </li></ul></ul><ul><ul><li>DBA solo declara nivel paralelismo en tabla </li></ul></ul><ul><ul><li>parallel_adaptive_multi_user configurado dinámicamente </li></ul></ul><ul><ul><li>Incremento almacenamiento en Large Pool </li></ul></ul>parallel_automatic_tuning Descripción Parámetro
  26. 26. Juan Sánchez – jsancheznav@gmail.com Parámetros Sistema <ul><li>Si TRUE: </li></ul><ul><ul><li>Mejora rendimiento en entornos multiuser </li></ul></ul><ul><ul><li>Se asume ajuste optimo en entorno monousuario </li></ul></ul>parallel_adaptive_multi_user Descripción Parámetro
  27. 27. Juan Sánchez – jsancheznav@gmail.com Parámetros Ocultos Sistema SELECT a.ksppinm &quot;Parameter&quot;, a.ksppdesc &quot;Description&quot;, b.ksppstvl &quot;Session Value&quot;, c.ksppstvl &quot;Instance Value&quot; FROM x$ksppi a, x$ksppcv b, x$ksppsv c WHERE a.indx = b.indx and a.indx = c.indx and a.ksppinm LIKE '/_parallel%' escape '/'; Controla el úmbral por el que CBO invoca el uso de OPQ _parallelism_cost_fudge_factor Descripción Parámetro
  28. 28. <ul><li>Vistas </li></ul><ul><ul><li>v_$pq_sysstat; </li></ul></ul><ul><ul><li>v_$px_process; </li></ul></ul><ul><ul><li>v_$px_sesstat; </li></ul></ul><ul><ul><li>v_$px_process_sysstat; </li></ul></ul>Juan Sánchez – jsancheznav@gmail.com Informe Uso Paralelización
  29. 29. <ul><li>Tomar snapshot con statspack </li></ul><ul><li>Realizar consulta </li></ul><ul><ul><li>select to_char(snap_time,'yyyy-mm-dd HH24') mydate, </li></ul></ul><ul><ul><li>new.value nbr_pq </li></ul></ul><ul><ul><li>from perfstat.stats$sysstat old, </li></ul></ul><ul><ul><li>perfstat.stats$sysstat new, </li></ul></ul><ul><ul><li>perfstat.stats$snapshot sn </li></ul></ul><ul><ul><li>where new.name = old.name and new.name = 'queries parallelized' </li></ul></ul><ul><ul><li>and new.snap_id = sn.snap_id and old.snap_id = sn.snap_id-1 </li></ul></ul><ul><ul><li>and new.value > 1 </li></ul></ul><ul><ul><li>order by to_char(snap_time,'yyyy-mm-dd HH24'); </li></ul></ul>Juan Sánchez – jsancheznav@gmail.com Informe Uso Paralelización
  30. 30. <ul><li>Datapump </li></ul><ul><ul><li>expdp </li></ul></ul><ul><ul><li>impdp </li></ul></ul><ul><li>Replicación </li></ul><ul><li>Reconstrucción de objetos </li></ul>Juan Sánchez – jsancheznav@gmail.com Más allá de DML/Select

×