엔터프라이즈 솔루션에서 불가결한 데이터베이스. 정말 많이 사용하는 데이터 베이스를 어떻게 하면 좀더 효율적으로 사용할 수 있을까?
다른 많은 부분이 있지만 일단 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
'데이터베이스 > SQL Server' 카테고리의 다른 글
DBCC DBREINDEX를 이용해서 한번에 한 서버의 모든 데이터베이스의 인덱스 재 작성하기 (0) | 2008.04.28 |
---|---|
TpmC기반의 용량 산정 (0) | 2008.04.28 |
유용한 MS-SQL 사이트 (0) | 2008.04.25 |
분산쿼리를 위한 연결서버(LinkedServer) 구성하기 (0) | 2008.04.25 |
sp_addlinkedserver SB link (0) | 2008.04.25 |