다음을 통해 공유


분산 분할된 뷰 만들기

분할된 뷰를 구현하기 전에 먼저 테이블을 행으로 분할해야 합니다. 파티션 구성표를 디자인할 때 각 멤버 테이블에 어떤 데이터가 속할 것인지 분명해야 합니다. 원본 테이블은 여러 개의 작은 멤버 테이블로 바뀝니다. 각 멤버 테이블에는 원본 테이블과 같은 수의 열이 포함되고, 각 열은 원본 테이블의 해당 열과 같은 특성(데이터 형식, 크기, 정렬 등)을 갖습니다. 분산 분할된 뷰를 만드는 경우에 각 멤버 테이블은 개별 멤버 서버에 있습니다. 위치를 가장 명확하게 표시하려면 멤버 데이터베이스의 이름이 각 멤버 서버에서 반드시 동일해야 하는 것은 아니지만 동일한 것이 좋습니다 예: Server1.CustomerDB, Server2.CustomerDB, Server3.CustomerDB.

멤버 테이블 만들기

키 값의 범위에 기반하여 각 테이블에 원본 테이블의 행을 저장하도록 멤버 테이블을 디자인합니다. 범위는 분할 열의 데이터 값에 기초합니다. 각 멤버 테이블에서 값의 범위는 분할 열의 CHECK 제약 조건에 따라 강제로 정해지며 범위는 겹쳐질 수 없습니다. 예를 들어 1부터 200000까지의 범위를 갖는 테이블과 150000부터 300000까지의 범위를 갖는 또 다른 테이블이 있을 수 없습니다. 왜냐하면 150000부터 200000 사이의 범위를 포함하는 테이블이 분명하지 않기 때문입니다.

예를 들어, Customer 테이블을 3개의 테이블로 분할합니다. 이 3개의 테이블에 대한 CHECK 제약 조건은 다음과 같습니다.

-- On Server1:
CREATE TABLE Customers_33
  (CustomerID   INTEGER PRIMARY KEY
                CHECK (CustomerID BETWEEN 1 AND 32999),
  ... -- Additional column definitions)

-- On Server2:
CREATE TABLE Customers_66
  (CustomerID   INTEGER PRIMARY KEY
                CHECK (CustomerID BETWEEN 33000 AND 65999),
  ... -- Additional column definitions)

-- On Server3:
CREATE TABLE Customers_99
  (CustomerID   INTEGER PRIMARY KEY
                CHECK (CustomerID BETWEEN 66000 AND 99999),
  ... -- Additional column definitions)

분산형 분할 뷰 정의

멤버 테이블을 만든 후에 각 멤버 서버에 같은 이름을 갖는 분산형 분할 뷰를 정의합니다. 그러면 분산형 분할 뷰 이름을 참조하는 쿼리를 하나 이상의 멤버 서버에서 실행할 수 있습니다. 시스템은 원본 테이블의 복사본이 각 멤버 서버에 있는 것처럼 작동하지만 각 서버에는 하나의 멤버 테이블과 분산 분할된 뷰만 있는 것입니다. 응용 프로그램에서는 데이터의 위치를 인식하지 못합니다.

다음 태스크를 수행하여 분산형 분할 뷰를 작성할 수 있습니다.

  • 다른 멤버 서버에서 분산 쿼리를 실행하는 데 필요한 연결 정보가 들어 있는 각 멤버 서버에 연결된 서버 정의를 추가합니다. 그러면 분산형 분할 뷰가 다른 서버에 있는 데이터에 액세스할 수 있습니다.

  • 분산형 분할 뷰에서 사용되는 연결된 각 서버 정의에 대해 sp_serveroption을 사용하여 lazy schema validation 옵션을 설정합니다. 따라서 실제로 원격 멤버 테이블의 데이터가 필요할 때까지는 쿼리 프로세서에서 연결된 테이블의 메타데이터를 요청하지 않으므로 성능이 최적화됩니다.

  • 각 멤버 서버에 분산형 분할 뷰를 만듭니다. 뷰는 분산된 SELECT 문을 사용하여 연결된 멤버 서버에 있는 데이터에 액세스하고 분산된 행을 로컬 멤버 테이블에 있는 행과 병합합니다.

앞의 예에서 분산형 분할 뷰를 만들려면 다음을 수행해야 합니다.

  • Server2에 대한 연결 정보가 있는 Server2라는 이름의 연결된 서버 정의와 Server3에 대한 액세스 정보가 있는 Server3이라는 이름의 연결된 서버 정의를 추가합니다.

  • 다음의 분산형 분할 뷰를 만듭니다.

    CREATE VIEW Customers AS
       SELECT * FROM CompanyDatabase.TableOwner.Customers_33
    UNION ALL
       SELECT * FROM Server2.CompanyDatabase.TableOwner.Customers_66
    UNION ALL
       SELECT * FROM Server3.CompanyDatabase.TableOwner.Customers_99
    
  • Server2 및 Server3에 대해 같은 단계를 수행합니다.

테이블 규칙

멤버 테이블은 뷰 정의에 있는 각 SELECT 문의 FROM 절에서 정의됩니다. 각 멤버 테이블은 다음 규칙을 따라야 합니다.

  • 멤버 테이블은 뷰에서 두 번 이상 참조할 수 없습니다.

  • 멤버 테이블은 계산 열에서 만들어진 인덱스를 가질 수 없습니다.

  • 멤버 테이블은 같은 수의 열에 모두 PRIMARY KEY 제약 조건이 있어야 합니다.

  • 멤버 테이블에는 동일한 ANSI 패딩 설정이 있어야 합니다. ANSI 패딩 설정에 대한 자세한 내용은 SET ANSI_PADDING을 참조하십시오.

열 규칙

열은 뷰 정의에 있는 각 SELECT 문의 SELECT 목록에서 정의됩니다. 각 열은 다음 규칙을 따라야 합니다.

  • 각 멤버 테이블에 있는 모든 열은 SELECT 목록에 포함되어야 합니다. SELECT * FROM <member table>은 사용 가능한 구문입니다.

  • SELECT 목록에서 열을 두 번 이상 참조할 수 없습니다.

  • 열은 SELECT 목록에서 같은 서수 위치에 있어야 합니다.

  • 각 SELECT 문의 SELECT 목록에 있는 열의 유형은 같아야 합니다. 여기에는 데이터 형식, 전체 자릿수, 소수 자릿수 및 정렬이 포함됩니다. 예를 들어 다음 뷰 정의는 두 SELECT 문에 있는 데이터 형식이 같지 않기 때문에 실패합니다.

    CREATE VIEW NonUpdatable
    AS
    SELECT IntPrimaryKey, IntPartNmbr
    FROM FirstTable
      UNION ALL
    SELECT NumericPrimaryKey, IntPartNmbr
    FROM SecondTable
    

분할 열 규칙

분할을 위해 열 하나만 사용할 수 있으며 열은 반드시 각 멤버 테이블에 있어야 합니다. CHECK 제약 조건은 각 멤버 테이블에서 사용할 수 있는 데이터를 식별합니다. 다음 추가 규칙이 적용됩니다.

  • 각 테이블에서 CHECK 제약 조건의 키 범위는 다른 테이블의 범위와 겹쳐질 수 없습니다. 분할 열의 특정 값은 한 테이블로만 매핑되어야 합니다. CHECK 제약 조건에는 BETWEEN, IN, AND, OR, <, <=, >, >=, = 연산자만 사용할 수 있습니다.

  • 분할 열은 ID 열, 기본 열 또는 timestamp 열이 될 수 없습니다.

  • 분할 열은 뷰에 있는 각 SELECT 문의 SELECT 목록에서 같은 서수 위치에 있어야 합니다. 예를 들어 분할 열은 항상 각 SELECT 목록에서 첫 번째 열 또는 두 번째 열 등이 되어야 합니다.

  • 분할 열은 Null을 허용할 수 없습니다.

  • 분할 열은 테이블의 기본 키의 일부여야 합니다.

  • 분할 열은 계산 열이 될 수 없습니다.

  • 분할 열에는 하나의 제약 조건만 있어야 합니다. 제약 조건이 두 개 이상 있으면 SQL Server가 모든 제약 조건을 무시하므로 뷰가 분할된 뷰인지 여부를 판단할 때 제약 조건을 고려하지 않습니다.

  • 분할 열의 업데이트 가능성에는 제한이 없습니다.

이러한 모든 규칙을 따르는 분할된 열은 쿼리 최적화 프로그램에서 지원하는 모든 최적화를 지원하게 됩니다. 자세한 내용은 분산형 분할 뷰 확인을 참조하십시오.

일반 규칙

[!참고]

다음 조건은 같은 서버에서 작성된 로컬 분할된 뷰에는 적용되지 않습니다. 이 기능은 이전 버전과의 호환성을 위해 포함되어 있습니다.

다음은 고려해야 할 추가 규칙의 일부입니다.

  • 분산형 분할 뷰는 EXCEPT 또는 INTERSECT 연산자를 사용하여 구성할 수 없습니다.

  • 업데이트에 의해 영향을 받는 모든 노드에 걸쳐 원자성을 확보하기 위해 분산 트랜잭션이 시작됩니다.

  • XACT_ABORT SET 옵션을 ON으로 설정해야 합니다.

  • 원격 테이블의 smallmoneysmalldatetime 열은 각각 moneydatetime으로 매핑됩니다. 따라서 로컬 테이블의 해당 열도 moneydatetime이어야 합니다.

  • 연결된 서버는 연결된 루프백 서버가 될 수 없습니다. 이는 같은 SQL Server 인스턴스를 가리키는 연결된 서버입니다.

이러한 규칙을 따르지 않고 분할된 테이블을 참조하는 뷰는 뷰에 INSTEAD OF 트리거가 있으면 계속 업데이트할 수 있습니다. 그러나 쿼리 최적화 프로그램이 INSTEAD OF 트리거가 있는 뷰에 대해 모든 규칙을 따르는 분할된 뷰의 계획만큼 효율적인 실행 계획을 항상 작성할 수는 없습니다.