레이블이 FORALL인 게시물을 표시합니다. 모든 게시물 표시
레이블이 FORALL인 게시물을 표시합니다. 모든 게시물 표시

2022년 1월 1일 토요일

PLSQL BULK COLLECT INTO 실습, SELECT, FETCH에서 BULK COLLECT INTO 사용하기, 오라클교육, SQL교육, JAVA교육, 오라클학원, SQL학원, 자바학원, 오라클동영상

 PLSQL BULK COLLECT INTO 실습, SELECT, FETCH에서   BULK COLLECT INTO 사용하기, 오라클교육, SQL교육, JAVA교육, 오라클학원, SQL학원, 자바학원, 오라클동영상





https://youtu.be/x6gW4inKtZg


https://www.youtube.com/watch?v=RE79vqW_s6o&list=PLxU-iZCqT52CfP98Y4gCDKIm52tKvgy36&index=31 

https://www.youtube.com/watch?v=mAQNkUZ_9CA&list=PLxU-iZCqT52CfP98Y4gCDKIm52tKvgy36&index=30 




SELECT, FETCH에서 

BULK COLLECT INTO 사용하기


[BULK COLLECT INTO]

SELECT에서 BULK COLLECT INTO를 이용하면 여러건의 레코드를 한번에 읽어들여 속도를 향상 시킬 수 있으며,  커서에서도 FETCH를 하는 경우에도 한건씩 꺼내는것 보다 한번에 꺼낸다면 속도 향상에 도움이 될 수 있습니다.  물론 이 경우 읽어들이는 데이터에 따른 메모리 사용량은 고려 되어야 합니다.


BULK COLLECT INTO 다음에는 여러 레코드를 한번에 담을 수 있는 데이터 타입이 와야 하는데 PL/SQL의 TABLE 타입(일차원 배열)을 사용합니다.


다음과 같은 경우에 사용 가능 합니다.


SELECT 컬럼리스트  BULK COLLECT INTO 컬렉션

FETCH 커서명 BULK COLLECT INTO 컬렉션

EXECUTE IMMEDIATE 쿼리문자열  BULK COLLECT INTO 컬렉션


[실습]

set timing on
select * from myemp1;

-- 일반적인 FOR LOOP 커서 사용
declare    
    cursor emp_cur is select * from myemp1 where rownum < 400000;
    tot number := 0;
    emp_r myemp1%rowtype;
begin 
    open emp_cur;
    loop  
        fetch emp_cur into emp_r;
        exit when emp_cur%notfound;
        tot := tot + emp_r.sal;  
    end loop;
    dbms_output.put_line('tot : ' || tot);   
    close emp_cur;
exception
    when others then
        dbms_output.put_line(sqlerrm(sqlcode));
end;

-- SELECT절에서 BULK COLLECT INTO 사용하기
declare 
    type emp_r_array is table of myemp1%rowtype; 
    emp_table emp_r_array;
    tot number := 0;
begin
    select * bulk collect into emp_table
    from myemp1 
    where rownum < 400000;
    
    DBMS_OUTPUT.PUT_LINE('SQL%ROWCOUNT : ' || SQL%ROWCOUNT);
    
    for i in emp_table.first..emp_table.last loop  
        tot := tot + emp_table(i).sal;    
    end loop;
    
    dbms_output.put_line('tot : ' || tot);    
exception
    when others then
        dbms_output.put_line(sqlerrm(sqlcode));
end;


-- FETCH에서 BULK COLLECT INFO 사용하기
create or replace procedure getEmp3
is
   type empcurtype is ref cursor;
   type empnolist is table of myemp1.empno%type;
   type enamelist is table of myemp1.ename%type;
   
   emp_cur empcurtype;
   empnos empnolist;
   enames enamelist;
begin
   open emp_cur for 'select empno, ename from myemp1 where rownum < 1000';
   fetch emp_cur bulk collect into empnos, enames;
   for i in enames.first..enames.last loop
      dbms_output.put_line(enames(i));
   end loop;   
   close emp_cur;
end;
/
exec getEmp3;


#PLSQL #BULKCOLLECTINTO , #오라클커거, #forall, #오라클교육, #SQL교육, #JAVA교육, #오라클학원, #SQL학원, #자바학원, #오라클동영상, PLSQL BULKCOLLECTINTO , 오라클커거, forall, 오라클교육, SQL교육, JAVA교육, 오라클학원, SQL학원, 자바학원, 오라클동영상, 

2021년 12월 31일 금요일

오라클동영상,FORALL 기반 벌크 입력(BULK INSERT) 실습, DMLL성능향상, 오라클교육, 오라클학원, SQL교육, SQL학원, 자바학원, 자바교육, SQL동영상

 오라클동영상,FORALL 기반 벌크 입력(BULK INSERT) 실습, DMLL성능향상, 오라클교육, 오라클학원, SQL교육, SQL학원, 자바학원, 자바교육, SQL동영상


http://ojc.asia/bbs/board.php?bo_table=LecSQLnPlSql&wr_id=722 


FORALL 기반 벌크 입력(BULK INSERT) 실습, DMLL성능향상, 오라클교육, 오라클학원, SQL교육, SQL학원, 자

FORALL 기반 벌크 입력(BULK INSERT) 실습, DMLL성능향상, 오라클교육, 오라클학원, SQL교육, SQL학원, 자바학원, 자바교육, SQL동영상오라클 PL/SQL성능향상을 위한FORALL기반 BULK INSERT실습[실습]사번(empno),

ojc.asia

https://www.youtube.com/watch?v=RE79vqW_s6o&list=PLxU-iZCqT52CfP98Y4gCDKIm52tKvgy36&index=31 


https://www.youtube.com/watch?v=mAQNkUZ_9CA&list=PLxU-iZCqT52CfP98Y4gCDKIm52tKvgy36&index=30 


https://www.youtube.com/watch?v=Ub3XCyENie0&list=PLxU-iZCqT52CfP98Y4gCDKIm52tKvgy36&index=25 

오라클 PL/SQL




성능향상을 위한

FORALL기반 BULK INSERT


실습




[실습]

사번(empno), 이름(ename), 직무(job) 3개의 컬럼을 갖는 BULKTEST라는 테이블을 생성하여 100만건 정도 데이터를 입력하는데. 개별 건씩 입력 하는것과 FORALL을 이용하여 벌크로 INSERT하는 방식의 성능차이에 대해 확인해 보겠습니다.

FORALL을 이용하여 DML문을 작성하면 한 번에 한 행씩 실행될 모든 DML 문을 생성하고 SQL 실행엔진에 한번에 모두 보냅니다.

FORALL 구문을 이용하면 INSERT, UPDATE, DELETE와 같은 DML 사용시 컬렉션을 사용하며 매우 빠르게 작업을 할 수 있습니다.

FORALL구문은 데이터를 오라클의 TABLE TYPE(배열)에 담아서 한번에 SQL 실행엔진에 넘겨서 실행을 하므로 성능 향상에 도움이 됩니다.


1. 실습 테이블 생성

create table bulktest (
empno number primary key,
ename varchar2(20),
job   varchar2(50));


set timing on
alter system flush SHARED_POOL;

2. 일반적인 반복문을 통한 개별 INSERT
-- 24초 경과
declare
          cnt number := 0;
begin
     while (cnt < 1000000) loop
            cnt := cnt + 1;
            insert /*+ loop insert */ into bulktest values ( cnt, cnt || '길동', '개발직');               
      end loop;
      commit;
end;



3. Shared Pool에서 파싱된 SQL문 및 실행횟수 확인

-- 오라클이 INSERT 구문을 내부적으로 바인드 변수 처리를 하여 SQL문장은 하나, 실행횟수는 1,000,000임을 알수 있습니다.
select substr(sql_text,1,60) "sql", count(*),
       sum(executions) "총실행횟수"
from v$sqlarea
where sql_text like '%loop%'
group by substr(sql_text,1,60)
having count(*) > 0
order by 2;

select count(1) from bulktest;
truncate table bulktest;

4. FORALL을 이용한 BULK INSERT

alter system flush SHARED_POOL;

-- 2초
declare
  type bulktype is table of bulktest%rowtype index by binary_integer;
  mydata bulktype;
begin
  for i in 1 .. 1000000 loop
    mydata(i).empno := i;
    mydata(i).ename := i || '길동';
    mydata(i).job := '개발직';
  end loop;

  forall i in 1 .. 1000000 insert /*+ bulk insert */  into bulktest values mydata(i);
  commit;
end;


5. Shared Pool에서 파싱된 SQL문 및 실행횟수 확인

-- 오라클이 INSERT 구문을 내부적으로 바인드 변수 처리를 하여 SQL문장은 하나, 실행횟수도 하나임을 확인할 수 있습니다.
select substr(sql_text,1,60) "sql", count(*),
       sum(executions) "총실행횟수"
from v$sqlarea
where sql_text like '%bulk%'
group by substr(sql_text,1,60)
having count(*) > 0
order by 2;


select count(1) from bulktest;
truncate table bulktest;



#FORALL, #벌크입력, #BULKINSERT, #SQL튜닝, #오라클교육, #오라클학원,#SQL교육, #SQL학원, #자바학원, #자바교육, #SQL동영상, FORALL, 벌크입력, BULKINSERT, SQL튜닝, 오라클교육, 오라클학원,SQL교육, SQL학원, 자바학원, 자바교육, SQL동영상


(C#교육동영상)C# ADO.NET 실습 ODP.NET/ODAC 설치 오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원

  (C#교육동영상)C# ADO.NET 실습  ODP.NET/ODAC 설치  오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원 https://www.youtube.com/watch?v=qIPU85yAlzc&list=PLxU-i...