2011-08-23 13 views
5

Ben yapmak istemiyorum, paralellik kullandığımız bir seçme SQL sorgusu, buParalelliğin derecesini dinamik olarak belirleyebilir miyiz?

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

böyle bir şey var derecede sabit kodlanmış Burada görebileceğiniz gibi, ben ancak bu sayısında beri Bu kodun yürütüldüğü tüm DB'lerde CPU'lar aynı değildir.

My requirement: Kullanılabilir CPU sayısı için V$PARAMETER numaralı sorguyu sorgulamam gerekiyor ve sorgumda result-2 değerini kullanmam gerekiyor. Böyle bir şey ...

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; 

Ama ne olursa olsun mevcut CPU, ben olmasını beklendiği gibi çalışmıyor ve ben 32 paralel konuları görüyoruz. Bu doğru bir yol mu? Yoksa, benim gereksinim için başka bir çözüm var mı?

cevap

3

Vivek,

Bir PL/SQL işlev veya yordam içinde bir INSERT deyimi oluşturmak için dinamik SQL kullanabilirsiniz. Bu şekilde zaten aldığınız değişken "derece" yi kullanabildiniz. gibi

şey:

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

Lanet .... Bu seçeneği nasıl özledim. Teşekkürler Olie. – Vivek

2

neden otomatik olarak paralellik belirlemek için oracle kullanılmasın? Eğer taneli sizin gibi derecesini tanımlamak ince olabilir ima olmadan

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

:

+0

Nasıl yapmalı? 'Varsayılan' kullanarak mı? Eğer evet ise, bu kullanılabilir tüm cpus kullanın? – Vivek

+0

@Vivek 'default' başka bir şeydir. "Parallel_degree_policy" parametresini "AUTO" olarak ayarladığınızda Oracle DOP'u dinamik olarak belirleyebilir. – psur

1

Neden ile oturum için derecesini zorlamayın.