분할된 뷰 사용

분할된 뷰를 사용하여 큰 테이블의 데이터를 더 작은 멤버 테이블로 분할할 수 있습니다. 데이터는 특정 열에서 데이터 값 범위에 기초하여 멤버 테이블 간에 분할됩니다. 각 멤버 테이블의 데이터 범위는 분할 열에 지정된 CHECK 제약 조건에서 정의합니다. 그런 다음 UNION ALL을 사용하여 모든 멤버 테이블의 선택 내용을 단일 결과 집합으로 조합하는 뷰를 정의합니다. 뷰를 참조하는 SELECT 문이 분할 열에 검색 조건을 지정하면 쿼리 최적화 프로그램은 CHECK 제약 조건 정의를 사용하여 행을 포함할 멤버 테이블을 결정합니다.

[!참고]

데이터를 하나의 서버에 대해 로컬로 분할할 때는 분할된 테이블을 사용하는 것이 좋습니다. 자세한 내용은 분할된 테이블 및 인덱스를 참조하십시오.

예를 들어 1998년의 매출액을 기록하는 매출액 테이블은 각 월마다 하나씩 모두 12개의 멤버 테이블로 분할됩니다. 각 멤버 테이블은 다음과 같이 OrderMonth 열에 정의된 제약 조건을 가집니다.

CREATE TABLE May1998sales
   (OrderID      INT,
   CustomerID      INT      NOT NULL,
   OrderDate      DATETIME      NULL
      CHECK (DATEPART(yy, OrderDate) = 1998),
   OrderMonth      INT
      CHECK (OrderMonth = 5),
   DeliveryDate      DATETIME      NULL
      CHECK(DATEPART(mm, DeliveryDate) = 5)
   CONSTRAINT OrderIDMonth PRIMARY KEY(OrderID, OrderMonth)
   )

May1998sales를 채우는 응용 프로그램은 OrderMonth 열의 모든 행이 5를 가지며 1998년 5월 중의 하루를 주문 날짜로 지정하도록 해야 합니다. 이 조건은 테이블에서 정의된 제약 조건에 의해 적용됩니다.

그런 다음 UNION ALL을 사용하여 12개 멤버 테이블 모두에서 데이터를 단일 결과 집합으로 선택하도록 다음과 같이 뷰를 정의합니다.

CREATE VIEW Year1998Sales
AS
SELECT * FROM Jan1998Sales
UNION ALL
SELECT * FROM Feb1998Sales
UNION ALL
SELECT * FROM Mar1998Sales
UNION ALL
SELECT * FROM Apr1998Sales
UNION ALL
SELECT * FROM May1998Sales
UNION ALL
SELECT * FROM Jun1998Sales
UNION ALL
SELECT * FROM Jul1998Sales
UNION ALL
SELECT * FROM Aug1998Sales
UNION ALL
SELECT * FROM Sep1998Sales
UNION ALL
SELECT * FROM Oct1998Sales
UNION ALL
SELECT * FROM Nov1998Sales
UNION ALL
SELECT * FROM Dec1998Sales

예를 들어 다음 SELECT 문은 특정 월의 정보를 쿼리합니다.

SELECT *
FROM Year1998Sales
WHERE OrderMonth IN (5,6) AND CustomerID = 64892

SQL Server 쿼리 최적화 프로그램은 이 SELECT 문의 검색 조건이 May1998Sales 및 Jun1998Sales 테이블에 있는 행만 참조하는 것으로 인식하므로 지정된 테이블로 검색을 제한합니다.

분할된 뷰에서 업데이트를 수행하려면 분할 열은 기본 테이블의 기본 키의 일부여야 합니다. 뷰를 업데이트할 수 없는 경우에는 업데이트를 허용하는 뷰에 대해 INSTEAD OF 트리거를 만들 수 있습니다. 중복되는 행이 삽입되지 않도록 트리거에 오류 처리 기능을 설계해야 합니다. 뷰에 설계되는 INSTEAD OF 트리거의 예는 INSTEAD OF 트리거 디자인을 참조하십시오.

분할된 뷰에는 정확한 결과를 반환하는 데 CHECK 제약 조건이 필요하지 않습니다. 그러나 CHECK 제약 조건을 정의하지 않으면 쿼리 최적화 프로그램은 분할 열에서 검색 조건에 해당하는 테이블 대신 모든 테이블을 검색합니다. CHECK 제약 조건이 없는 뷰는 UNION ALL을 가진 다른 뷰와 마찬가지로 작동합니다. 쿼리 최적화 프로그램은 다른 테이블에 저장된 값에 대해 어떠한 가정도 할 수 없으며 뷰 정의에 참여하는 테이블의 검색을 건너뛸 수 없습니다.

분할된 뷰가 참조하는 모든 멤버 테이블이 같은 서버에 있으면 뷰는 로컬 분할 뷰가 됩니다. 멤버 테이블이 여러 서버에 있으면 뷰는 분산형 분할 뷰가 됩니다. 분산형 분할 뷰를 사용하여 시스템의 데이터베이스 처리 로드를 서버 그룹으로 배분할 수 있습니다. 자세한 내용은 연결된 데이터베이스 서버를 참조하십시오.

분할된 뷰를 사용하면 멤버 테이블을 더 쉽게 개별 관리할 수 있습니다. 예를 들어 특정 기간이 끝나는 시점에 다음 작업을 수행할 수 있습니다.

  • 현재 결과에 대한 분할된 뷰 정의를 변경하여 가장 최신의 기간을 추가하고 이전 기간을 삭제할 수 있습니다.

  • 이전 결과에 대한 분할된 뷰 정의를 변경하여 현재 결과 뷰에서 방금 삭제한 기간을 추가할 수 있습니다. 또한 이전 결과 뷰를 업데이트하여 가장 오래된 기간을 제거 및 보관할 수 있습니다.

분할된 뷰에 데이터를 삽입할 경우 sp_executesql 시스템 저장 프로시저를 사용하여 동시 사용자가 많은 시스템에서 다시 사용될 가능성이 높은 실행 계획을 고려한 INSERT 문을 만들 수 있습니다.

[!참고]

bcp 명령과 BULK INSERT 및 INSERT ... SELECT * FROM OPENROWSET(BULK...) 문을 통해 데이터를 분할된 뷰로 대량 가져오기는 지원되지 않습니다. 그러나 INSERT 문을 사용하여 분할된 뷰에 여러 행을 삽입할 수 있습니다.