728x90

create or replace procedure my_proc( p_rc OUT SYS_REFCURSOR )
as
begin
  open p_rc
   for select 1 col1
         from dual;
end;
/

variable rc refcursor;
exec my_proc( :rc );
print rc;

728x90

엔터프라이즈 솔루션에서 불가결한 데이터베이스. 정말 많이 사용하는 데이터 베이스를 어떻게 하면 좀더 효율적으로 사용할 수 있을까?


다른 많은 부분이 있지만 일단 DB에 대해 많이 알아야 잘 사용할 수 있을 것이다.


그러나 여기선 많이 안다고 생각하고 내 생각을 주저리 쓰겠다..


기준은 MS-SQL이다.


우리 많이 사용하는 DB 기능중에 하나는 커서이다. 우리가 ADO나 ADO.NET을 사용할 때 MS-SQL은 내부적으로 커서를 사용하게 된다.


가장 많이 사용하지만 대용량 데이터 처리시에는 정말 죽음이라고 생각할 정도로 퍼포먼스가 안나온다.


그래서 커서를 사용하지 않은 대용량 데이터를 사용할 수 있는 방법을 생각해보자..


커서를 사용하는 첫번째 이유는 반복적인 데이터 처리이다. 1000라인이던지 10000이던지 그 라인 하나 하나를 처리 하는것이 커서를 사용하는 목적이 되겠다.


그럼 커서를 어떻게 사용하는지 부터 알아보자.



위 소스는 아주 간단한 커서 사용문이다. 위와 같이 사용하면 된다. 커서에 대해서는 나중에 더 자세하게 풀어가 보도록 해야겠다.
커서는 재미있다.



DECLARE vend_cursor CURSOR
FOR SELECT * FROM Purchasing.Vendor
OPEN vend_cursor
FETCH NEXT FROM vend_cursor


위 소스는 아주 간단한 커서 사용문이다. 위와 같이 사용하면 된다. 커서에 대해서는 나중에 더 자세하게 풀어가 보도록 해야겠다.


커서에 대해서 알아가면 갈 수록 재미있을 것이다.


그럼 위의 문을 어떻게 커서를 사용하지 않고 빠르게 진행할 수 있을까.. 힌트는 임시테이블이다. 임시테이블을 사용하는것도 그렇게 퍼포먼스에 도움이 되지는 않으나. 커서 보다는 빠른 속도를 얻을 수 있다.


그럼 만들어 보자.


DECLARE @tmpTable (

      code int intentity(1,1)

      , vendorid varchar(20)

)


위와 같이 임시 테이블을 생성했다 그리고 나면 바로 여기에 가공할 vendor 아이디 들을 넣어둔다.

INSERT @tmpTable
SELECT venordid
FROM Purchasing.Vendor

그럼 이제 임시 테이블  @tmpTable에는 사용할 vendor아이디 들만 들어가있다.. 이제 이걸 반복적으로 데이터를 뽑아내 업데이트를 하거나 거시기를 하면된다. 이건 예제 이므로... 좀 말이 안되는 쿼리도 나올 수 있다. 다 그냥 이렇게 사용하는거다라고 말하는것 뿐이니 그냥 참고하기 바란다 .

WHILE @totalCount >= @count
     BEGIN
         SELECT * FROM @tmpTable WHERE code=@count
         /* 여기서 알아서 작업을 하시길 */
         SET @count = @count + 1
     END

위와 같이 하면 되겠다. 이런 일반 커서를 사용하는것 보다 좀 더 좋은 퍼포먼스를 얻을 수 있다.

한가지 더 .. 일반적으로 레코드셋( Recordset )을 사용할 때는 반드시 커서타입이나. Lock Type을 지정해 주시기 바란다.

adOpenDynamic 은 adLockOptimistic 이라는 Lock조건을 줘야 업데이트, 인서트가 가능해 진다. 그리고 그냥 리스트 용으로 Recordset을 사용 할 경우는 adOpenForwardOnly, adLockReadOnly 쌍을 사용하기 바란다.

그리고 쿼리를 사용할 경우는 adCmdText , 테이블에 insert를 할 경우는 adCmdTableDirect라는 조건을 줘야 한다.

원문 : http://cafe.naver.com/askakiller/76

+ Recent posts