2011-08-23 9 views
5

Tengo una consulta de selección SQL que utilizan paralelismo, algo como esto¿Podemos especificar el grado de paralelismo de forma dinámica?

INSERT/*+ APPEND PARALLEL (tst, 6) */ INTO test_table tst 
       (
        ************** 
        ************** 
        ************** 
       ) 
    SELECT /*+ PARALLEL (a, 6) */ DISTINCT 
        ************** 
        ************** 
        ************** 
     FROM src_table a; 

Como se puede ver aquí, he-codificado el grado pero, yo no quiero hacer eso, ya que el número de Las CPU no son iguales en todos los DB donde se ejecuta este código.

My requirement: Necesito consultar V$PARAMETER para el recuento de CPU disponible y utilizar el valor como result-2 en mi consulta. Algo como esto ...

DECLARE 
    degree  varchar2(1); 
BEGIN 
select value-2 INTO degree from v$parameter where name='cpu_count'; 

      INSERT/*+ APPEND PARALLEL (tst, degree) */ INTO test_table tst 
      (
       ************** 
       ************** 
       ************** 
      ) 
SELECT /*+ PARALLEL (a, degree) */ DISTINCT 
       ************** 
       ************** 
       ************** 
    FROM src_table a; 
END; 

embargo, no está funcionando como yo esperaba que fuera y veo 32 hilos paralelos, con independencia de las CPU disponibles. ¿Es esta una forma correcta de hacerlo? Si no, ¿hay alguna otra solución para mi requerimiento?

Respuesta

3

Vivek,

Usted podría utilizar SQL dinámico para construir su sentencia INSERT dentro de una función PL/SQL o procedimiento. De esta forma, podría utilizar la variable "grado" que ya recuperó.

Algo así como:

DECLARE 
    degree varchar2(1); 
BEGIN 
    select value-2 
    INTO degree 
    from v$parameter 
    where name='cpu_count';    

    EXECUTE IMMEDIATE('INSERT /*+ APPEND PARALLEL (tst, '||degree||') */ '|| 
        ' INTO test_table tst ('|| 
        '  ************** '|| 
        '  ************** '|| 
        '  ************** '|| 
        ' ) '|| 
        'SELECT /*+ PARALLEL (a, '||degree||') */ '|| 
        '  DISTINCT '|| 
        '  ************** '|| 
        '  ************** '|| 
        '  ************** '|| 
        ' FROM src_table a'); 
END; 
+0

Maldición ... ¿Cómo me perdí esta opción. Gracias Olie. – Vivek

2

Por qué no utilizar Oracle para determinar automáticamente el paralelismo?

+0

¿Cómo hacer eso? ¿Usando 'predeterminado'? En caso afirmativo, ¿no utilizará esto toda la CPU disponible? – Vivek

+0

@Vivek 'default' es otra cosa. Oracle puede determinar DOP dinámicamente cuando establece el parámetro 'parallel_degree_policy' en' AUTO'. – psur

1

Por qué no forzar el grado de la sesión con:

alter session force parallel dml parallel <dop>; 
alter session force parallel query parallel <dop>; 

Sin dando a entender que puede granular fino a definir el grado te gusta.

Cuestiones relacionadas