본문 바로가기

MSSQL/SQL Server 2005 new Feature

TABLESAMPLE 절

SQL Server 2005에 새로 도입된 TABLESAMPLE SELECT 결과 집합을 샘플링으로 퍼센트, 행의수로 결과를 도출해 낼수 있습니다.. 즉 모든 데이터를 처리할 필요가 없거나, 정확한 결과가 아닌 대략적인 결과를 필요로 하는 경우에 사용 할 수 있습니다.

 

구문 형식

TABLESAMPLE [SYSTEM] (sample_number [ PERCENT | ROWS ] )

[ REPEATABLE (repeat_seed) ]

 

SYSTEM 옵션

SYSTEM ANSI SQL 구현에 종속적인 샘플링 방법을 지정합니다. SYSTEM 옵션은 선택 사항이지만 SQL Server 2005에서 사용할 수 있는 유일한 샘플링 방법이며 기본적으로 적용됩니다.

TABLESAMPLE SYSTEM은 행의 대략적인 백분율을 반환하며 테이블에서 각 8KB의 실제 페이지에 대해 임의 값을 생성합니다. 페이지에 대한 임의 값과 쿼리에서 지정한 비율을 기준으로 샘플에 페이지가 포함되거나 제외됩니다. 포함된 각 페이지는 샘플 결과 집합에 모든 행을 반환합니다. 예를 들어 TABLESAMPLE SYSTEM 10 PERCENT로 지정하면 SQL Server에서는 지정된 테이블의 데이터 페이지 중 약 10%에 해당하는 행이 반환됩니다. 테이블의 페이지에 행이 균일하게 분산되어 있고 테이블의 페이지 수가 충분한 경우 반환되는 행의 수는 요청한 샘플 크기와 거의 동일합니다. 그러나 각 페이지에 대해 생성되는 임의 값은 다른 페이지에 대해 생성되는 값과는 별개이므로 반환되는 페이지의 비율이 요청한 비율보다 크거나 작을 수 있습니다. TOP(n) 연산자를 사용하여 행의 수를 지정된 최대값으로 제한할 수 있습니다.

테이블의 전체 행 수를 기준으로 비율을 지정하는 대신 여러 행을 지정하면 이 행 수는 결국 반환되어야 할 페이지인 행의 비율로 변환됩니다. 그러면 이 계산된 비율에 따라 TABLESAMPLE 작업이 수행됩니다.

테이블이 단일 페이지로 구성되어 있으면 페이지의 모든 행이 반환되거나 아무 행도 반환되지 않습니다. 이 경우 TABLESAMPLE SYSTEM은 페이지의 행 수에 관계없이 페이지에서 100% 또는 0%에 해당하는 행만 반환할 수 있습니다.

특정 테이블에 TABLESAMPLE SYSTEM을 사용하면 실행 계획에서 해당 테이블에 대한 테이블 검색(힙 검색 또는 클러스터형 인덱스 검색) 사용이 제한됩니다. 실행 계획에서 테이블 검색이 수행되는 것으로 표시되더라도 실제로는 데이터 파일에서 결과 집합에 포함된 페이지만 읽어야 합니다.

 

REPEATABLE 옵션

REPEATABLE 옵션을 사용하면 선택한 샘플이 다시 반환됩니다. REPEATABLE에 동일한 repeat_seed 값을 지정하면 테이블을 변경하지 않는 한 SQL Server에서는 동일한 행 하위 집합이 반환됩니다. REPEATABLE에 다른 repeat_seed 값을 지정하면 SQL Server에서 테이블의 다른 행 샘플이 반환될 가능성이 있습니다. 이 경우 테이블을 변경하는 것으로 간주되는 작업으로는 삽입, 업데이트, 삭제, 인덱스 다시 작성, 인덱스 조각 모음, 데이터베이스 복원 및 데이터베이스 연결 등이 있습니다.

 

자 이제 어떤식으로 사용 되는지 알아 보도록 하겠습니다.

SELECT * FROM Sales.SalesOrderDetail TABLESAMPLE (1000 ROWS)

 

실행

Row

1

1288

2

658

3

806

4

1232

5

1064

 

이처럼 실행를 계속 해보면서 결과값의 총 Row 를 확인해보면 정확히 1000 Rows 의 결과값을

도출해 낼수 없습니다.

 

SELECT TOP 250 * FROM Sales.SalesOrderDetail TABLESAMPLE (1000 ROWS)

 

 

말그대로 샘플링 데이터이기 때문에 특정한 Row 개수를 요구 한다면 Top 절을 이용하여

사용 할수 있습니다.

 

 

 

SELECT TOP 10 * FROM Sales.SalesOrderDetail TABLESAMPLE (1000 ROWS)

 

SalesOrderID 결과

실행1

실행2

실행3

실행4

실행5

47967
47967
47967
47967
47967
47967
47967
47967
47967
47967

50208
50208
50208
50208
50208
50208
50208
50208
50208
50208

43850
43850
43850
43850
43850
43850
43850
43850
43850
43850

44311
44311
44312
44312
44312
44312
44313
44313
44313
44313

44127
44127
44127
44127
44127
44127
44127
44127
44127
44127

 

이처럼 실행을 몇번 해보면 할때마다 다른 값들이 출력이 되게 됩니다.

 

SELECT TOP 10 * FROM Sales.SalesOrderDetail TABLESAMPLE (1000 ROWS) REPEATABLE (25)

 

실행시마다 다른 샘플링을 가져 오게 되기 때문에 REPEATABLE 옵션을 통해 출력시 같은 데이터가 출력 되도록 할수 있습니다.


참고 : MSDN