RE: RE: URGENT : sql*loader performance problem on partionned tab

2003-09-05 Thread NGUYEN Philippe (Cetelem)
Title: RE: RE: URGENT : sql*loader performance problem on partionned tab





here the trace :
SELECT STATEMENT, GOAL = CHOOSE         2   72  1368    
 FOR UPDATE                     
  FILTER                        
   PARTITION RANGE SINGLE                       
    TABLE ACCESS BY LOCAL INDEX ROWID   FICOM   HREL_FUSION 2   72  1368    
 INDEX RANGE SCAN   FICOM   IDX_HREL_FUSION_P_COD_REL   1   72      
   TABLE ACCESS BY INDEX ROWID  FICOM   PRIMEDI_ENR2_TEMP_FUSION    2   1   32  
    INDEX RANGE SCAN    FICOM   IDX_PRIMCOD_ENR2_TEMP_FUSION    1   1       



TIA


> 
> Philippe Nguyen
> CETELEM - Administration, Architecture Décisionnelle
> Direction Customer Relationship Management
> E-Mail : [EMAIL PROTECTED]
> Tel  : (+33) 1 46 39 92 16 - Fax : (+33) 1 46 39 59 88
> 



-Message d'origine-
De : [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED]]
Envoyé : 05 September 2003 00:09
À : Multiple recipients of list ORACLE-L
Objet : RE: RE: URGENT : sql*loader performance problem on partionned
tab



Did you explain plan? I suspect FTS taking place in case of NOT EXISTS.
It must be using Range scan for the non partitioned table.
Can you confirm / post the explain plan.


GovindanK



> Here the informations :
> table HREL_FUSION :
>   63 millions rows
>   3 indexes on columns : nodos_or, nodos_or, numcli <--- too much
> indexes ??
> table primedi_enr2_temp_fusion : 133 000 rows
>   I also took snaps with stastpack, can it help you ?
>   this table is recreated and re-analyze each day, but the hanging
> part of the scritp in located here :
>
> **
> SELECT NULL
> FROM hrel_fusion
> WHERE cod_rel = :b1
>   AND dat_rel = :b2
>   AND NOT EXISTS (SELECT NULL
>   FROM primedi_enr2_temp_fusion
>   WHERE primedi_enr2_temp_fusion.nodos_or =
> hrel_fusion.nodos_or
> AND primedi_enr2_temp_fusion.code_logis =
> hrel_fusion.cod_rel
> AND primedi_enr2_temp_fusion.date_logis =
> hrel_fusion.dat_rel)
> FOR UPDATE
> **
>
> The mostly amazing thing is that the same script work in 12 min on
> non-partitionned table.
>
> Here a subset of the script :
> ***
>
> cat <$maj_histo_rel
>
>
> set serveroutput on;
> DECLARE
>
> vt_code_logis   char(4);
> vt_date_logis   number(4);
> n   number;
>
> cursor curs_code_ctlm is
> select code_logis,date_logis from primedi_temp_fusion
> where exists (select null from $TABLE_RETOURS
> where $TABLE_RETOURS.code_logis=primedi_temp_fusion.code_logis
> and $TABLE_RETOURS.date_logis=primedi_temp_fusion.date_logis
> and $TABLE_RETOURS.code_ficom=primedi_temp_fusion.code_ficom
> )
> ;
>
>
> cursor curs_histo_ctlm1 (vt_code_logis char, vt_date_logis number) is
> select null from HREL_FUSION
> where cod_rel=vt_code_logis
> and dat_rel=vt_date_logis
> and not exists (select null from primedi_enr2_temp_fusion
> where
> primedi_enr2_temp_fusion.nodos_or=HREL_FUSION.nodos_or
> and
> primedi_enr2_temp_fusion.code_logis=HREL_FUSION.cod_rel
> and
> primedi_enr2_temp_fusion.date_logis=HREL_FUSION.dat_rel)
> for update
> ;
>
> BEGIN
> DBMS_OUTPUT.ENABLE(50);
> for curs in curs_code_ctlm
> loop
> n:=0;
>    for enr_histo in curs_histo_ctlm1
> (curs.code_logis,curs.date_logis) loop
>    delete from HREL_FUSION
>    where current of curs_histo_ctlm1;
>    n:=n+1;
>    --if (mod(n,5000) = 0) then
>  --commit;
>    --end if;
>    end loop;
>    --commit;
>    DBMS_OUTPUT.PUT_LINE('Supression de ' || n || ' ligne(s) '
> ||curs.code_logis || curs.date_logis || ' dans l historique HREL_FUSION');
>
>
>    -- update $TABLE_RETOURS
>    -- set DATE_MAJ=to_number(to_char(sysdate,'mmdd'))
>    -- where exists (select null from primedi_temp_fusion
> --  where curs.code_logis=$TABLE_RETOURS.code_logis
> --  and curs.date_logis=$TABLE_RETOURS.date_logis
> --  )
> --;
>
> end loop;
> COMMIT;
>
> END;
> /
> exit;
>
> EOD
> ***
>


-- 
Plea

RE: RE: URGENT : sql*loader performance problem on partionned tab

2003-09-04 Thread cornichepark
Did you explain plan? I suspect FTS taking place in case of NOT EXISTS.
It must be using Range scan for the non partitioned table.
Can you confirm / post the explain plan.

GovindanK


> Here the informations :
> table HREL_FUSION :
>   63 millions rows
>   3 indexes on columns : nodos_or, nodos_or, numcli <--- too much
> indexes ??
> table primedi_enr2_temp_fusion : 133 000 rows
>   I also took snaps with stastpack, can it help you ?
>   this table is recreated and re-analyze each day, but the hanging
> part of the scritp in located here :
>
> **
> SELECT NULL
> FROM hrel_fusion
> WHERE cod_rel = :b1
>   AND dat_rel = :b2
>   AND NOT EXISTS (SELECT NULL
>   FROM primedi_enr2_temp_fusion
>   WHERE primedi_enr2_temp_fusion.nodos_or =
> hrel_fusion.nodos_or
> AND primedi_enr2_temp_fusion.code_logis =
> hrel_fusion.cod_rel
> AND primedi_enr2_temp_fusion.date_logis =
> hrel_fusion.dat_rel)
> FOR UPDATE
> **
>
> The mostly amazing thing is that the same script work in 12 min on
> non-partitionned table.
>
> Here a subset of the script :
> ***
>
> cat <$maj_histo_rel
>
>
> set serveroutput on;
> DECLARE
>
> vt_code_logis   char(4);
> vt_date_logis   number(4);
> n   number;
>
> cursor curs_code_ctlm is
> select code_logis,date_logis from primedi_temp_fusion
> where exists (select null from $TABLE_RETOURS
> where $TABLE_RETOURS.code_logis=primedi_temp_fusion.code_logis
> and $TABLE_RETOURS.date_logis=primedi_temp_fusion.date_logis
> and $TABLE_RETOURS.code_ficom=primedi_temp_fusion.code_ficom
> )
> ;
>
>
> cursor curs_histo_ctlm1 (vt_code_logis char, vt_date_logis number) is
> select null from HREL_FUSION
> where cod_rel=vt_code_logis
> and dat_rel=vt_date_logis
> and not exists (select null from primedi_enr2_temp_fusion
> where
> primedi_enr2_temp_fusion.nodos_or=HREL_FUSION.nodos_or
> and
> primedi_enr2_temp_fusion.code_logis=HREL_FUSION.cod_rel
> and
> primedi_enr2_temp_fusion.date_logis=HREL_FUSION.dat_rel)
> for update
> ;
>
> BEGIN
> DBMS_OUTPUT.ENABLE(50);
> for curs in curs_code_ctlm
> loop
> n:=0;
>for enr_histo in curs_histo_ctlm1
> (curs.code_logis,curs.date_logis) loop
>delete from HREL_FUSION
>where current of curs_histo_ctlm1;
>n:=n+1;
>--if (mod(n,5000) = 0) then
>  --commit;
>--end if;
>end loop;
>--commit;
>DBMS_OUTPUT.PUT_LINE('Supression de ' || n || ' ligne(s) '
> ||curs.code_logis || curs.date_logis || ' dans l historique HREL_FUSION');
>
>
>-- update $TABLE_RETOURS
>-- set DATE_MAJ=to_number(to_char(sysdate,'mmdd'))
>-- where exists (select null from primedi_temp_fusion
> --  where curs.code_logis=$TABLE_RETOURS.code_logis
> --  and curs.date_logis=$TABLE_RETOURS.date_logis
> --  )
> --;
>
> end loop;
> COMMIT;
>
> END;
> /
> exit;
>
> EOD
> ***
>

-- 
Please see the official ORACLE-L FAQ: http://www.orafaq.net
-- 
Author: 
  INET: [EMAIL PROTECTED]

Fat City Network Services-- 858-538-5051 http://www.fatcity.com
San Diego, California-- Mailing list and web hosting services
-
To REMOVE yourself from this mailing list, send an E-Mail message
to: [EMAIL PROTECTED] (note EXACT spelling of 'ListGuru') and in
the message BODY, include a line containing: UNSUB ORACLE-L
(or the name of mailing list you want to be removed from).  You may
also send the HELP command for other information (like subscribing).


RE: RE: URGENT : sql*loader performance problem on partionned tab

2003-09-04 Thread NGUYEN Philippe (Cetelem)
Title: RE: RE: URGENT : sql*loader performance problem on partionned table - not sql*loader problem but cursor pb!





Here the informations :
table HREL_FUSION : 
    63 millions rows
    3 indexes on columns : nodos_or, nodos_or, numcli <--- too much indexes ??
table primedi_enr2_temp_fusion : 133 000 rows
    I also took snaps with stastpack, can it help you ?
    this table is recreated and re-analyze each day, but the hanging part of the scritp in located here :


**
SELECT NULL
    FROM hrel_fusion
    WHERE cod_rel = :b1
  AND dat_rel = :b2
  AND NOT EXISTS (SELECT NULL
  FROM primedi_enr2_temp_fusion
  WHERE primedi_enr2_temp_fusion.nodos_or = 
    hrel_fusion.nodos_or
    AND primedi_enr2_temp_fusion.code_logis = 
    hrel_fusion.cod_rel
    AND primedi_enr2_temp_fusion.date_logis = 
    hrel_fusion.dat_rel)
    FOR UPDATE
**


The mostly amazing thing is that the same script work in 12 min on non-partitionned table.


Here a subset of the script :
***


cat <$maj_histo_rel



set serveroutput on;
DECLARE


vt_code_logis   char(4);
vt_date_logis   number(4);
n   number;


cursor curs_code_ctlm is 
select code_logis,date_logis from primedi_temp_fusion
where exists (select null from $TABLE_RETOURS
    where $TABLE_RETOURS.code_logis=primedi_temp_fusion.code_logis
    and $TABLE_RETOURS.date_logis=primedi_temp_fusion.date_logis
    and $TABLE_RETOURS.code_ficom=primedi_temp_fusion.code_ficom
    )
;



cursor curs_histo_ctlm1 (vt_code_logis char, vt_date_logis number) is
select null from HREL_FUSION
where cod_rel=vt_code_logis
and dat_rel=vt_date_logis
and not exists (select null from primedi_enr2_temp_fusion
    where primedi_enr2_temp_fusion.nodos_or=HREL_FUSION.nodos_or
    and primedi_enr2_temp_fusion.code_logis=HREL_FUSION.cod_rel
    and primedi_enr2_temp_fusion.date_logis=HREL_FUSION.dat_rel)
for update
;


BEGIN
DBMS_OUTPUT.ENABLE(50);
for curs in curs_code_ctlm
loop
    n:=0;
   for enr_histo in curs_histo_ctlm1 (curs.code_logis,curs.date_logis) loop
   delete from HREL_FUSION
   where current of curs_histo_ctlm1;
   n:=n+1;
   --if (mod(n,5000) = 0) then
 --commit;
   --end if;
   end loop;
   --commit;
   DBMS_OUTPUT.PUT_LINE('Supression de ' || n || ' ligne(s) ' ||curs.code_logis || curs.date_logis || ' dans l historique HREL_FUSION');


   -- update $TABLE_RETOURS
   -- set DATE_MAJ=to_number(to_char(sysdate,'mmdd'))
   -- where exists (select null from primedi_temp_fusion
--  where curs.code_logis=$TABLE_RETOURS.code_logis
--  and curs.date_logis=$TABLE_RETOURS.date_logis
--  )
--;


end loop;
COMMIT;
   
END;
/
exit;


EOD
***