#title 부분범위처리 [[TableOfContents]] ==== 부분범위처리의 기본 ==== 부분범위처리를 말로 장황하게 설명하는 것 보다는 예제를 통해서 이해하는 것이 훨씬 쉽다. SQL Server 2000버전이라면 결과를 Grid로 보지말고 텍스트로 보고, SQL Server 2005라면 그냥 Grid로 결과를 봐도 된다. {{{ --테스트 준비 CREATE TABLE #i(i int) DECLARE @i int SET @i = 1 WHILE(@i <= 100) BEGIN INSERT #i VALUES(@i) SET @i = @i + 1 END SELECT A.i i1 , B.i i2 , C.i i3 INTO #Temp FROM #i A, #i B, #i C --1백 만건 }}} 다음의 쿼리 1, 2를 차례로 수행해 본다. {{{ --1 SELECT * FROM #Temp --2 SELECT * FROM #Temp ORDER BY 1 }}} 두 쿼리의 응답시간[* 쿼리를 하고 첫 번째 행이 화면에 보여지는 시간]은 어떠한가? 1번 쿼리의 경우 2000버전의 경우 Grid로 볼 경우는 응답시간이 매우 느릴 것이고, Text로 결과를 본다면 1초도 안 되게 데이터를 볼 수 있을 것이다. 2005 버전의 경우는 2000버전의 Text로 결과를 볼 때처럼 빠른 응답시간을 가질 것이다. 2번 쿼리는 어떤 상황에서도 느린 응답시간을 가질 것이다. 1번 쿼리의 경우는 부분범위 처리를 한 것이며, 2번 쿼리의 경우는 전체범위처리를 한 것이다. 즉, 일부만을 처리해서 결과를 바로 볼 수 있는 상태가 되면 부분범위처리가 가능하다고 이야기한다. ==== 부분 범위처리 연산 ==== 그렇다면 어떤 경우에 부분범위처리를 하고, 어떤 경우에는 전체 범위처리를 할까? 답은 '정렬'에 있다. 정렬연산이 들어가면 전체범위처리를 한다고 생각하면 된다. 정렬 연산은 Group By, Distinct, Union과 같은 연산에서 일어난다. (Group by가 무조건 정렬(Sort) 연산을 하는 것은 아니다.)Oracle의 경우는 First_Row방식의 옵티마이저를 사용해야 부분범위처리를 제대로 사용할 수 있으며, MS-SQL Server와 같은 경우는 OPTION(FAST 1) 힌트를 주어야만 Oracle의 First_Row방식을 흉내낼 수 있다. ==== 어디에 써먹는가? ==== 이 개념을 어디에 어떻게 써먹어야 하는가? 일반적으로 웹환경은 불가능하다. 웹의 특성상 전체범위를 대상으로 처리가 되기 때문에 웹환경에서 부분범위처리하기는 매우 곤란할 것이다. 웹이 아닌 일반적인 WinAPI를 쓰는 환경이라면 가능할 수도 있다. 이도 Grid가 부분범위처리를 지원해야 써먹을 수 있다. SQL Server 2000 쿼리분석기에서 쓰이는 Grid와 같은 경우는 부분범위 처리를 써먹을 수 없다. SSIS에서는 유용하게 쓰일 수도 있다. 원본에 SQL문을 날리고 전체의 데이터를 얻어오는 것보다 대상(Destination)에 넣는 과정이 훨씬 비용이 많이 든다면 부분 범위처리를 고려해 봐야 할 것이다. 왜냐하면 SSIS는 기본적으로 [http://kmh.ync.ac.kr/comIntro/mano/chapt-92.html 파이프라인]이라는 것을 쓰니까 말이다.