Você está na página 1de 11

Paralelismo: Mitos e Fatos Paralelismo Objetivo: Mostrar atravs da teoria e alguns exemplos prticos que o uso do paralelismo deve

ser testado e alinhado juntamente com os DBAs, j que nem sempre utiliz-lo resulta em um ganho de desempenho. Quando uma consulta SQL executada em paralelo, cria-se um processo chamado Query Coordinator (QC) e vrios outros processos Queries Slaves, chamados Pn, Onde n varia de acordo com o nmero de paralelismo indicado no comando. Por exemplo, quando utilizamos o hint /*+ parallel (P,4) */, estamos criando um processo QC e os slaves: P1, P2, P3 e P4. Na figura 1, temos o funcionamento de uma parallel query tomando como ponto de partida a consulta: select /*+ paralel (e, 4) */ from emp order by ename ;

Figura1: Funcionamento Interno O Query Coordinator (QC) responsvel por coordenar a execuo do Queries Slaves, reunir as informaes recebidas por cada processo slave e apresentar o conjunto de resultados para o usurio que enviou a consulta SQL. Os Queries Slaves so os verdadeiros responsveis pela coleta dos dados da consulta SQL em si. QuandoQueries Slaves terminam a leitura dos dados, estes enviam esses dados para o QC atravs de mensagens de buffer. Essas mensagens tm seu tamanho especificado pelo parmetro parallel_execution_message_size e so trocadas em uma rea especfica de buffer. O parmetro parallel_automatic_tuning define o lugar deste buffer de mensagens. Se o parmetro estiver setado para TRUE, o buffer ser utilizado na large pool, se estiver setado para FALSE a rea de memria utilizada ser a shared pool. Portanto, recomendado que se o banco de dados executa muitas consultas paralelas, estudar um tamanho apropriado para esta rea de memria e, alm disso, configurar valores mnimos para estas reas de memria. Isso demonstra que a utilizao de paralelismo em SQLs deve ser alinhada com o DBA e bem testada, para que os parmetros de memria sejam configurados de forma coerente. Outro ponto importante a ser mencionado que a abertura de vrios processos paralelos em um SQL ocasiona lentido tambm na

prpria abertura dos processos. Vamos a um exemplo prtico: SELECT /*+ FULL (c) PARALLEL (c, 5,2) */ C.*, E.*, C.*, P.*, T.* FROM EMP_CONTROL EC, EMP EM, PRODUCT_CRB T, CONTRACT C, PRODUCT P WHERE (C.EMP = EC.EMP) AND (EC.EMP = EM.EMP) AND (C.CURSO = 10) AND (C.PRE_POS = 10) AND (C.PRODUTO = P.PRODUTO) AND (C.PRODUTO = T.PRODUTO) AND (T.CURSO = C.CURSO) AND (C.DT_CANC IS NULL) AND (C.DT_LIQ_EFETIVA IS NULL) AND ((C.VAL_APRDO_LIQ = 0 OR C.VAL_APRDO_LIQ IS NULL) OR (C.VAL_APRDO_LIQ > 0 AND C.DT_CESSAO IS NOT NULL)) AND (C.DT_EFETIVA <= EC.DT_FECHAMENTO) AND (C.DT_ULT_APRO < EC.DT_FECHAMENTO) AND (EC.NUM_AUDSID = 58900238) AND (C.STATUS IN (0, 4)) AND (C.RENDAS_A_APROP <> C.VAL_APRDO) AND (C.TX_APROP > 0) AND ((T.PROC_PERM = 0) OR (T.PROC_PERM = 1 AND C.DT_ULTI_VCT < E.DT_FECHAMENTO)) AND ((EC.DT_FECHAMENTO < (SELECT MIN(DT_LIQ_EFETIVA) FROM CONTRACT_REA CR1 WHERE CR1.CONTRATO = C.CONTRATO)) OR ((NOT EXISTS (SELECT 1 FROM CONTRACT_REA CR3 WHERE (CR3.CONTRATO = C.CONTRATO AND E.DT_FECHAMENTO >= CR3.DT_LIQ_EFETIVA AND E.DT_FECHAMENTO < CR3.DT_REAB_LIQ) AND ROWNUM = 1))) OR ((EC.DT_FECHAMENTO > (SELECT MAX(DT_REAB_LIQ) FROM CONTRATO_REA CR4 WHERE CR4.CONTRATO = C.CONTRATO)))) AND EXISTS (SELECT /*+ FULL (p) PARALLEL (p, 4,2) */ 1 FROM PARC P1 WHERE C.CONTRATO = P1.CONTRATO AND P1.STATUS IN (0, 1) AND ((ST_TIPO_CESSAO IS NULL) OR (ST_CESSAO IS NULL)) AND ROWNUM = 1) ORDER BY C.EMP ; | Id | Operation | Name | Rows | | 0 | SELECT STATEMENT | | 1 | | 1 | SORT ORDER BY | | 1 | |* 2 | FILTER | | | | 3 | PX COORDINATOR | | | | 4 | PX SEND QC (RANDOM) | :TQ20001 | 4 | | 5 | NESTED LOOPS | | 4 | | 6 | NESTED LOOPS | | 4 | |* 7 | HASH JOIN | | 4 | | 8 | BUFFER SORT | | | | 9 | PX RECEIVE | | 32 | | 10 | PX SEND BROADCAST | :TQ20000 | 32 | | 11 | MERGE JOIN CARTESIAN | | 32 | | 12 | TABLE ACCESS BY INDEX ROWID| EMP_CONTROL | 1 | |* 13 | INDEX RANGE SCAN | EMP_CONTROL_01 | 1 | | 14 | BUFFER SORT | | 32 | |* 15 | TABLE ACCESS FULL | PRODUCT_CRB | 32 | | 16 | PX BLOCK ITERATOR | | 827K| |* 17 | TABLE ACCESS FULL | CONTRACT | 827K| | 18 | TABLE ACCESS BY INDEX ROWID | PRODUCT | 1 | |* 19 | INDEX UNIQUE SCAN | SYS_C0049229 | 1 | | 20 | TABLE ACCESS BY INDEX ROWID | EMP | 1 | |* 21 | INDEX UNIQUE SCAN | SYS_C0049040 | 1 | |* 22 | COUNT STOPKEY | | | | 23 | PX COORDINATOR | | | | 24 | PX SEND QC (RANDOM) | :TQ10000 | 2 | |* 25 | COUNT STOPKEY | | | | 26 | PX BLOCK ITERATOR | | 2 | |* 27 | TABLE ACCESS FULL | PARC | 2 | | 28 | SORT AGGREGATE | | 1 | | 29 | TABLE ACCESS BY INDEX ROWID | CONTRACT_REA | 1 | |* 30 | INDEX RANGE SCAN | SYS_C0048917 | 1 | |* 31 | COUNT STOPKEY | | | |* 32 | TABLE ACCESS BY INDEX ROWID | CONTRACT_REA | 1 | |* 33 | INDEX RANGE SCAN | SYS_C0048917 | 1 | | 34 | SORT AGGREGATE | | 1 |

| 35 | FIRST ROW | | 1 | |* 36 | INDEX RANGE SCAN (MIN/MAX) | SYS_C0048917 | 1 | Note a presena dos processos PX Coordinator e a diferena no plano de execuo comparada ao plano de execuo 2 abaixo, destaquei tambm a linha que apresenta o MERGE JOIN CARTESIAN j que este mtodo de join realiza a multiplicao cartesiana das linhas de duas fontes de dados. | Id | Operation | Name | Rows | | 0 | SELECT STATEMENT | | 1 | | 1 | SORT ORDER BY | | 1 | |* 2 | FILTER | | | |* 3 | HASH JOIN | | 4 | | 4 | NESTED LOOPS | | 4 | | 5 | NESTED LOOPS | | 4 | | 6 | NESTED LOOPS | | 1 | | 7 | TABLE ACCESS BY INDEX ROWID | EMP_CONTROL | 1 | |* 8 | INDEX RANGE SCAN | EMP_CONTROL_01 | 1 | | 9 | TABLE ACCESS BY INDEX ROWID | EMP | 1 | |* 10 | INDEX UNIQUE SCAN | SYS_C0049040 | 1 | | 11 | INLIST ITERATOR | | | |* 12 | TABLE ACCESS BY INDEX ROWID | CONTRACT | 4 | |* 13 | INDEX RANGE SCAN | CON_13 | 286 | | 14 | TABLE ACCESS BY INDEX ROWID | PRODUCT | 1 | |* 15 | INDEX UNIQUE SCAN | SYS_C0049229 | 1 | |* 16 | TABLE ACCESS FULL | PRODUCT_CTB | 32 | |* 17 | COUNT STOPKEY | | | |* 18 | TABLE ACCESS BY INDEX ROWID | PARC | 2 | |* 19 | INDEX RANGE SCAN | INDX_PARC_04 | 17 | | 20 | SORT AGGREGATE | | 1 | | 21 | TABLE ACCESS BY INDEX ROWID | CONTRACT_REA | 1 | |* 22 | INDEX RANGE SCAN | SYS_C0048917 | 1 | |* 23 | COUNT STOPKEY | | | |* 24 | TABLE ACCESS BY INDEX ROWID | CONTRACT_REA | 1 | |* 25 | INDEX RANGE SCAN | SYS_C0048917 | 1 | | 26 | SORT AGGREGATE | | 1 | | 27 | FIRST ROW | | 1 | |* 28 | INDEX RANGE SCAN (MIN/MAX)| SYS_C0048917 | 1 | Note os mtodos de joins totalmente diferentes realizados pelo otimizador para a resoluo do SQL, neste caso a sequncia de NESTED LOOPS muito mais eficiente para o trmino do comando. As tabelas abaixo mostram as estatsticas e o tempo de execuo de cada consulta: Estatstica 349 recursive calls 6 db block gets 68 consistent gets 0 physical reads 1240 redo size 1135 bytes sent via SQL*Net to client 465 bytes received via SQL*Net from client 1 SQL*Net roundtrips to/from client 23 sorts (memory) 0 sorts (disk) 1 rows processed Tempo decorrido: 00.00:02.25

Estatstica 8 recursive calls 0 db block gets 3 consistent gets 0 physical reads 0 redo size 1135 bytes sent via SQL*Net to client 396 bytes received via SQL*Net from client 1 SQL*Net roundtrips to/from client 1 sorts (memory) 0 sorts (disk) 1 rows processed Tempo decorrido: 00.00:00.25 No caso deste SQL a diferena em buffer gets de aproximadamente 96% e em tempo de resposta aproximadamente 89%. A anlise acima comprova que o aumento do nmero de processos paralelos para a realizao da consulta (grau de paralelismo) no torna sua execuo mais performtica. Jos Eduardo Fiamengui Jnior jeduardounicamp@gmail.com Parallel Query Tem vezes que necessitamos fazer consultas ou atualizaes em massa e no tem opo, vamos inevitavelmente fazer full em uma tabela muito grande. Se j procuramos diversas opes e no encontramos nenhum outro recurso inteligente, podemos minimizar o impacto deste processamento dividindo seu trabalho entre as diversas CPUs do servidor. Obviamente este processo no server para servidores monoprocessados, se tem um nico servidor, no tem com quem compartilhar o trabalho No meu caso tenho servidores quad-core, j trabalhei com servidores AIX, HP, Solaris com mltiplos processadores, nestes casos a opo bastante interessante Quando lanamos um processo ao sistema operacional, ele pega um processador e, caso o mesmo encontra-se disponvel, temos at cem por cento de uso desse processador, em servidores multiprocessados, temos um processador em cem por cento e os demais inativos. Usando o processamento paralelo, ns podemos utilizar todas as CPUs em um nico processo, o que vai dar um ganho significativo no processo alter table t1 parallel (degree 12); Aqui voc define que a tabela t1 ir executar processos em modo paralelo abrindo doze processos, como tenho um RAC com 3 ns com processadores quad-core, estaria usando toda a capacidade dos servidores, claro que isso no muito recomendado, bom sempre deixar alguns processadores para os outros processos select cod_cliente, count(*) from t1 where cod_cliente in (3098, 3653, 3185) group by cod_cliente; Esta consulta, que normalmente demoraria alguns minutos, por se tratar de uma tabela com milhes de registros, executada em poucos segundos, pois estou usando o mximo de recursos dos meus servidores. alter table giss.tb_boletos noparallel; No esquecer de desmarcar a tabela do modo paralelo Como a Oracle tambm gosta de facilitar a vida de seus usurios Sim ela no gosta s de complicar, ela ajuda tambm risos Select /*+ Parallel (t1, 12) */ cod_cliente, count(*) from t1 where cod_cliente in (3098, 3653, 3185) group by cod_cliente; Esta opo faz a mesma coisa Voc tambm pode usar em opes de processos DML : alter session enable parallel dml; insert /*+ parallel (t1,4,1) */ into t1 select * from t2; commit; alter session disable parallel dml;

Como tudo nesta vida, esta opo tem que ser usada com equilbrio, pois pode haver situaes em que tentamos acertar uma ponta e destruimos outra Execuo paralela de instrues SQL: Parallel Query, DML e DDL Postado em Maio 7th, 2012 sobre Alta disponibilidade,Oracle Database,Performance por Anderson Graf Varias vezes encontramos consultas, processos ou atualizaes em massa provocando um alto ndice de custos para o ambiente de banco de dados, apesar de varias otimizaes serem aplicadas o custo ainda extremamente alto o que acaba prejudicando varios processos e rotinas. Ento.. o que podemos fazer para diminuir este impacto? J pensou em paralelismo? O Paralelismo, disponibilizado na verso enterprise do Oracle database, oferece a ideia de se quebrar uma tarefa em partes para que, em vez de um nico processo fazer todo o trabalho, muitos processos possam executar simultniamente as partes e no final apresentar um resultado nico em menos tempo do que o executado por um nico processo. A execuo paralela proporcina melhorias no desempenho mediante a utilizao otimizada dos recursos de hardware do servidor, ou seja, podemos utilizar todas as CPUs de um servidor em uma nica atividade o que proporcionaria um ganho significativo no processo, por exemplo. Esta mesma distribuio pode ser realizada em um ambiente clusterizado(RAC), onde podemos utilizar, se necessrio, os recursos de todos os nodes para uma nica tarefa/processo. Contudo, quando implementado, devemos sempre ficar atentos ao consumo dos recursos do servidor como CPU, memria e discos, pois o paralelismo pode saturar completamente uma mquina, ficando ento a cargo do DBA equilibrar cuidadosamente o nmero de pessoas que executam operaes paralelas quanto o grau do paralelismo utilizado para que os recursos do servidor no sejam esgotados. Para a diviso e execuo simultnia das varias partes de uma tarefa, o Oracle cria uma sesso coordenador que gerencia os processos escravos responsveis pelas execues paralelas e que ao termino recebe de cada escravo os resultados e reproduz uma saida combinada de forma a obtermos o mesmo resultado do que uma execuo em serie, porem com o diferencial deste processo paralelo ter concluido muito mais rapidamente. O paralelismo pode ser especificado em 3 (trs) diferentes nveis: Nvel de instruo: Utilizando hints Nvel de objeto: Especificando o grau de paralelismo na definio do objeto, tabela ou indice. Nvel de instance: Ajustando as parmetrizaes da instance. (show parameter parallel) Visto um bsico histrico do funcionamento do paralelismo, vamos agora aprender sobre 3 tipos de paralelismo que so: Parallel Query, DML e DDL Parallel Query: O paralelismo de queries, tambm conhecida como PQO (Parallel Query Option), foi a primeira feature de execuo paralela desenvolvida pela Oracle e disponibilizada j na verso 7.1 do Oracle database, sendo que hoje a feature de paralelismo mais utilizada no SGBD Oracle.

Seu principal objetivo reduzir o tempo de execuo de grandes consultas, porm antes de implement-lo definitivamente devemos testar todas as consultas para garantir que elas vo se beneficiar do paralelismo. Para habilitar ou desabilitar o paralelismo podemos alterar uma tabela ou indice informando o grau de paralelismo ou atraves da utilizao de hints conforme exemplos abaixo: Para habilitar/utilizar o paralelismo: -> Nvel de objeto 1SQL> alter table teste1 parallel (degree 4); 2 3Table altered. 4 5SQL> alter table teste1 parallel 4; 6 7Table altered. -> Nvel de instruo: 1SQL> select /*+ PARALLEL(teste1,4,1) */ count(*) from teste1; 2 3 COUNT(*) 4---------5 1250000 Sintaxe: select /*+ PARALLEL(table_alias, degree, nodes) */ * from table_name Para visualizar o paralelismo configurado sobre a tabela/indice: 1SQL> select degree from user_tables where table_name='TESTE1'; 2 3DEGREE 4---------5 4 Para desabilitar o paralelismo: -> Nvel de objeto 1SQL> alter table teste1 NOPARALLEL; 2 3Table altered. 4 5SQL> select degree from user_tables where table_name='TESTE1'; 6 7DEGREE 8---------9 1 -> Nvel de instruo: 1SQL> select /*+ NOPARALLEL(teste1) */ count(*) from teste1; 2 3 COUNT(*) 4---------5 1250000 Vamos realizar agora um explain da query para verificar como fica sem e com paralelismo:

1 SQL> explain plan for 2 2 select count(*) from teste1 3 3 / 4 5 Explained. 6 7 SQL> SELECT * FROM TABLE(dbms_xplan.display); 8 9 PLAN_TABLE_OUTPUT 10--------------------------------------------------------------------11Plan hash value: 3242138447 12 13--------------------------------------------------------------------14| Id | Operation | Name | Rows | Cost (%CPU)| Time | 15--------------------------------------------------------------------16| 0 | SELECT STATEMENT | | 1 | 553 (2)| 00:00:07 | 17| 1 | SORT AGGREGATE | | 1| | | 18| 2 | TABLE ACCESS FULL| TESTE1 | 1598K| 553 (2)| 00:00:07 | 19--------------------------------------------------------------------20 21SQL> explain plan for 22 2 select /*+ PARALLEL(teste1,4,1) */ count(*) from teste1 23 3 / 24 25Explained. 26 27SQL> SELECT * FROM TABLE(dbms_xplan.display); 28 29PLAN_TABLE_OUTPUT 30-------------------------------------------------------------------------------------------------------31Plan hash value: 721361025 32 33-------------------------------------------------------------------------------------------------------34| Id | Operation | Name | Rows | Cost (%CPU)| Time | TQ |IN-OUT| PQ Distrib | 35-------------------------------------------------------------------------------------------------------36| 0 | SELECT STATEMENT | | 1 | 153 (2)| 00:00:02 | | | | 37| 1 | SORT AGGREGATE | | 1| | | | | | 38| 2 | PX COORDINATOR | | | | | | | | 39| 3 | PX SEND QC (RANDOM) | :TQ10000 | 1 | | | Q1,00 | P->S | QC (RAND) | 40| 4 | SORT AGGREGATE | | 1| | | Q1,00 | PCWP | | 41| 5 | PX BLOCK ITERATOR | | 1598K| 153 (2)| 00:00:02 | Q1,00 | PCWC | | 42| 6 | TABLE ACCESS FULL| TESTE1 | 1598K| 153 (2)| 00:00:02 | Q1,00 | PCWP | | 43-------------------------------------------------------------------------------------------------------Note que quando executado uma instruo em paralelo temos como evidncia as operaes PX. Parallel DML: As operaes de DML (Data Manipulation Language) INSERT, UPDATE e DELETE tambm podem ser paralizadas e proporcionar grandes ganhos em tempo/custo, contudo quando a paralelizao de DML acionada o Oracle verifica algumas regras/restries para apontar se a paralelizao vlida ou no. Abaixo podemos ver as regras aplicadas, NOTE que UPDATE e DELETE possuem o mesmo escopo de verificao. Para UPDATE e DELETE: - A paralelizao pode ocorrer em tabelas particionadas, mas somente quando vrias parties esto envolvidos; - No pode ser paralizado o UPDATE e DELETE em uma tabela no particionada ou quando as operaes afetam apenas uma nica partio. Para operaes de INSERT:

- O INSERT padro utilizando a clusula VALUES no pode ser paralelizado, apenas pode ser paralelizado as declaraes INSERTSELECT. Vamos demonstrar um exemplo com e sem paralelismo: -> INSERTSELECT sem paralelismo: 1 SQL> set autotrace traceonly explain; 2 SQL> insert into teste1 select * from teste1; 3 4 1250000 rows created. 5 6 Execution Plan 7 ---------------------------------------------------------8 Plan hash value: 110554063 9 10----------------------------------------------------------------------------------11| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | 12----------------------------------------------------------------------------------13| 0 | INSERT STATEMENT | | 1250K| 4882K| 551 (2)| 00:00:07 | 14| 1 | LOAD TABLE CONVENTIONAL | TESTE1 | | | | | 15| 2 | TABLE ACCESS FULL | TESTE1 | 1250K| 4882K| 551 (2)| 00:00:07 | 16-----------------------------------------------------------------------------------> INSERTSELECT com paralelismo: 1 SQL> alter session enable parallel dml; 2 3 Session altered. 4 5 SQL> explain plan for 6 2 insert /*+ parallel (teste1,4,1) */ into teste1 select * from teste1; 7 8 Explained. 9 10SQL> SELECT * FROM TABLE(dbms_xplan.display); 11 12Execution Plan 13---------------------------------------------------------14Plan hash value: 1222195891 15 16----------------------------------------------------------------------------------------------------------------17| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | TQ |IN-OUT| PQ Distrib | 18----------------------------------------------------------------------------------------------------------------19| 0 | INSERT STATEMENT | | 1250K| 4882K| 29 (2)| 00:00:02 | | | | 20| 1 | PX COORDINATOR | | | | | | | | | 21| 2 | PX SEND QC (RANDOM) | :TQ10001 | 1250K| 4882K| 29 (2)| 00:00:02 | Q1,01 | P->S | QC (RAND) | 22| 3 | LOAD AS SELECT | TESTE1 | | | | | Q1,01 | PCWP | | 23| 4 | PX RECEIVE | | 1250K| 4882K| 29 (2)| 00:00:02 | Q1,01 | PCWP | | 24| 5 | PX SEND ROUND-ROBIN| :TQ10000 | 1250K| 4882K| 29 (2)| 00:00:02 | | S->P | RND-ROBIN | 25| 6 | TABLE ACCESS FULL | TESTE1 | 1250K| 4882K| 29 (2)| 00:00:02 | | | | 26----------------------------------------------------------------------------------------------------------------27 2813 rows selected. 29 30SQL> commit; 31 32Commit complete. 33 34SQL> alter session disable parallel dml; 35 36Session altered.

Parallel DDL: O paralelismo em instrues DDL se aplicam a tabelas e indices, particionadas ou no. -> Para tabelas: CREATE TABLEAS SELECT ALTER INDEXREBUILD PARTITION ALTER INDEXSPLIT PARTITION -> Para indices: CREATE INDEX ALTER INDEXREBUILD ALTER INDEXREBUILD PARTITION ALTER INDEXSPLIT PARTITION Lembrando que tabelas com objetos/campos com LOB no permitem paralelismo DDL. Exemplos de paralelismo com DDL: 1 SQL> explain plan for 2 2 create table teste_parallel parallel (degree 4) as select * from teste1; 3 4 Explained. 5 6 SQL> SELECT * FROM TABLE(dbms_xplan.display); 7 8 PLAN_TABLE_OUTPUT 9 ---------------------------------------------------------------------------------------------------------------------10Plan hash value: 3992983551 11 12---------------------------------------------------------------------------------------------------------------------13| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | TQ |IN-OUT| PQ Distrib | 14---------------------------------------------------------------------------------------------------------------------15| 0 | CREATE TABLE STATEMENT | | 10M| 38M| 2388 (1)| 00:00:29 | | | | 16| 1 | PX COORDINATOR | | | | | | | | | 17| 2 | PX SEND QC (RANDOM) | :TQ10000 | 10M| 38M| 1476 (1)| 00:00:18 | Q1,00 | P->S | QC (RAND) | 18| 3 | LOAD AS SELECT | TESTE_PARALLEL | | | | | Q1,00 | PCWP | | 19| 4 | PX BLOCK ITERATOR | | 10M| 38M| 1476 (1)| 00:00:18 | Q1,00 | PCWC | | 20| 5 | TABLE ACCESS FULL | TESTE1 | 10M| 38M| 1476 (1)| 00:00:18 | Q1,00 | PCWP | | 21---------------------------------------------------------------------------------------------------------------------Agora observe se criarmos a tabela sem Paralelismo: 1 SQL> explain plan for 2 2 create table teste_parallel as select * from teste1; 3 4 Explained. 5 6 SQL> SELECT * FROM TABLE(dbms_xplan.display); 7 8 PLAN_TABLE_OUTPUT 9 ----------------------------------------------------------------------------------------10Plan hash value: 3174501407

11 12----------------------------------------------------------------------------------------13| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | 14----------------------------------------------------------------------------------------15| 0 | CREATE TABLE STATEMENT | | 10M| 38M| 8967 (1)| 00:01:48 | 16| 1 | LOAD AS SELECT | TESTE_PARALLEL | | | | | 17| 2 | TABLE ACCESS FULL | TESTE1 | 10M| 38M| 5320 (1)| 00:01:04 | 18----------------------------------------------------------------------------------------Vamos ver um indice, com e sem paralelismo: 1 SQL> explain plan for 2 2 create index teste_idx01 on teste1(CD_TESTE) parallel (degree 4); 3 4 Explained. 5 6 SQL> SELECT * FROM TABLE(dbms_xplan.display); 7 8 PLAN_TABLE_OUTPUT 9 --------------------------------------------------------------------------------------------------------------------10Plan hash value: 1444741105 11 12--------------------------------------------------------------------------------------------------------------------13| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | TQ |IN-OUT| PQ Distrib | 14--------------------------------------------------------------------------------------------------------------------15| 0 | CREATE INDEX STATEMENT | | 10M| 38M| 2858 (1)| 00:00:35 | | | | 16| 1 | PX COORDINATOR | | | | | | | | | 17| 2 | PX SEND QC (ORDER) | :TQ10001 | 10M| 38M| | | Q1,01 | P->S | QC (ORDER) | 18| 3 | INDEX BUILD NON UNIQUE| TESTE_IDX01 | | | | | Q1,01 | PCWP | | 19| 4 | SORT CREATE INDEX | | 10M| 38M| | | Q1,01 | PCWP | | 20| 5 | PX RECEIVE | | 10M| 38M| 1476 (1)| 00:00:18 | Q1,01 | PCWP | | 21| 6 | PX SEND RANGE | :TQ10000 | 10M| 38M| 1476 (1)| 00:00:18 | Q1,00 | P->P | RANGE | 22| 7 | PX BLOCK ITERATOR | | 10M| 38M| 1476 (1)| 00:00:18 | Q1,00 | PCWC | | 23| 8 | TABLE ACCESS FULL| TESTE1 | 10M| 38M| 1476 (1)| 00:00:18 | Q1,00 | PCWP | | 24--------------------------------------------------------------------------------------------------------------------Sem paralelismo: 1 SQL> explain plan for 2 2 create index teste_idx01 on teste1(CD_TESTE); 3 4 Explained. 5 6 SQL> SELECT * FROM TABLE(dbms_xplan.display); 7 8 PLAN_TABLE_OUTPUT 9 -------------------------------------------------------------------------------------10Plan hash value: 3409988532 11 12-------------------------------------------------------------------------------------13| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | 14-------------------------------------------------------------------------------------15| 0 | CREATE INDEX STATEMENT | | 10M| 38M| 10846 (1)| 00:02:11 | 16| 1 | INDEX BUILD NON UNIQUE| TESTE_IDX01 | | | | | 17| 2 | SORT CREATE INDEX | | 10M| 38M| | | 18| 3 | TABLE ACCESS FULL | TESTE1 | 10M| 38M| 5320 (1)| 00:01:04 | 19-------------------------------------------------------------------------------------Referncias: http://docs.oracle.com/cd/B10501_01/server.920/a96524/c20paral.htm http://www.oracle.com/technetwork/issue-archive/2010/o40parallel-092275.html http://www.akadia.com/services/ora_parallel_processing.html#Parallel%20Recovery

Aumentar paralelismo da tabela Banco de dados Oracle. Amigos(as), bom dia, Vamos entender com o comando abaixo, como verificar e aumentar o paralelismo de tabelas no banco de dados Oracle. Isto implica em, a tabela poder receber instrues ( insert, update e delete ) em paralelo. Esse tipo de atividade realizada visando agilizar instrues realizadas na tabela. Observao: Antes de alterar o paralelismo, verifique quantos ncleos de CPU voc tem disponvel em seu hardware. No exemplo abaixo, realizei a alterao, pois possua 8 ncleos de CPU's e, verifique como est configurado o paralelismo para a tabela atualmente, segue comando abaixo: ( Verificar paralelismo da tabela ) select degree from dba_tables where table_name='TABLETESTE'; DEGREE -----1 ( Alterar paralelismo da tabela ) alter table OWNETESTE.TABLETESTE parallel (degree 4); Pronto, desta forma, o paralelismo da tabela TABLETESTE do owner OWNERTESTE foi alterado para o valor 4. Qualquer dvida, deixe seu comentrio. Abrao.

Você também pode gostar