OLE DB 공급자를 위한 배포 통계 요구 사항
분산 쿼리의 최적화를 향상시키기 위해 SQL Server는 OLE DB 공급자가 제공하는 행 집합 또는 테이블에 대한 배포 통계를 보고하는 데 사용할 수 있도록 OLE DB 사양에 대한 확장을 정의합니다. 이러한 확장이 SQL Server 설명서에 정의되어 있지만, 각 OLE DB 공급자 개발자는 SQL Server에서 이 정보를 사용할 수 있도록 하려면 각 공급자의 확장에 대해 지원하는 코드를 넣어야 합니다. 확장을 지원하는 코드가 공급자에 있으면, SQL Server가 이 확장을 사용하여 분산 쿼리의 성능을 최적화할 수 있습니다. 공급자가 확장을 지원하지 않으면 SQL Server는 배포 통계에 대한 대략의 예상 값을 사용합니다.
[!참고]
Microsoft SQL Server Native Client OLE DB 공급자와 Oracle용 Microsoft OLE DB 공급자는 배포 통계를 지원합니다.
배포 통계 확장은 대략 통계라는 단위로 작성됩니다. 각 테이블에는 0 이상의 통계가 있으며 각 통계는 하나 이상의 열의 데이터를 보고합니다. 통계에는 다음이 기록됩니다.
통계 범위에 해당하는 각 열의 고유 값 수 또는 값의 카디널리티
통계 범위에 해당하는 모든 열의 연결 값 카디널리티
통계 범위에 해당하는 첫 번째 열에서 다른 키 값 범위에 대한 정보를 보고하는 히스토그램(옵션). 보고된 값에는 각 키 범위의 행 수, 각 키 범위의 고유 값 수, 키 값이 해당 범위의 가장 높은 키 값과 같거나 적은 테이블의 행 수가 포함됩니다.
다음은 예제 테이블입니다.
ColumnA |
ColumnB |
---|---|
'abc' |
'xyz' |
'abc' |
'xyz' |
'def' |
'xyz' |
'mno' |
'xyz' |
'mno' |
'mmm' |
'tuv' |
'xyz' |
ColumnA 및 ColumnB를 적용하는 통계의 경우 두 열의 값이 조합된 카디널리티는 5입니다. 즉, 처음 두 행에는 조합된 값('abc' + 'xyz')이 동일하기 때문에 ColumnA 및 ColumnB에 대한 값의 고유 조합이 5개 있습니다.
ColumnA 단독의 카디널리티는 4이고 ColumnB 단독의 카디널리티는 2입니다. ColumnA에 대한 간단한 4단계의 히스토그램을 다음과 같이 보고할 수 있습니다.
값 범위 |
해당 범위에서 테이블 행의 비율 |
---|---|
'aaa' - 'hzz' |
50% |
'iaa' - 'nzz' |
33% |
'oaa' - 'rzz' |
00% |
'taa' - 'zzz' |
17% |
다른 OLE DB 데이터 원본은 서로 다른 열 조합에 대해 배포 통계를 보고하므로, OLE DB 공급자가 보고한 통계 집합이 정의된 구현입니다. 예를 들어 SQL Server 버전 6.5 이하에서는 인덱스에 해당하는 열에 대해서만 배포 통계를 만들고 테이블에 정의된 각 인덱스에 대해 통계가 하나만 포함되었습니다. SQL Server 버전 7.0 이상에서는 다음과 같은 통계를 작성할 수 있습니다.
테이블에 정의된 각 인덱스에 대한 통계 하나
각 CREATE STATISTIC 문에 대한 통계 하나
자동으로 생성되는 각 통계에 대한 통계 하나
조건자 인수에 지정된 특정 값에 대해 적은 행 수만 반환될 가능성이 있을 때는 열에 높은 수준의 선택도가 있습니다. 배포 통계를 사용하여 선택도 정도를 평가할 수 있습니다.
카디널리티가 높은 열에는 더 많은 데이터 값이 있고, 각 데이터 값은 카디널리티가 낮은 열보다 더 적은 수의 행에 일치합니다.
OLE DB 공급자가 열에서 데이터가 분산된 방법을 보고하는 히스토그램을 제공하면 SQL Server 최적화 프로그램은 조건자 인수 내의 특정 값이 선택도가 높거나 낮은 범위에 있는지 여부를 평가할 수 있습니다.
연결된 서버에 대해 적절한 배포 통계가 있으면 최적화 프로그램이 분산 쿼리의 로컬 부분에 대해 효율적인 실행 계획을 작성할 수 있습니다.
SQL Server 최적화 프로그램은 OLE DB 공급자와 SQL Server 간에 교환되어야 하는 데이터 양을 줄일 때 배포 통계를 사용합니다. 예를 들어, 로컬 서버의 TableA와 연결된 서버의 TableB 사이에 분산 조인을 수행할 때 SQL Server는 배포 통계를 사용하여 다음 중 가장 효율적인 프로세스를 결정합니다.
비조인 조건자와 일치하는 TableA의 행을 연결된 서버로 보내고 연결된 서버에서 조인을 수행하게 합니다.
로컬 서버에 대한 비조인 조건자와 일치하는 TableB의 행을 검색하고 로컬 서버에서 조인을 수행합니다.
OLE DB 공급자가 열에 대한 카디널리티 정보를 보고하지 않으면 SQL Server 최적화 프로그램이 낮은 카디널리티를 추정합니다. 공급자가 통계에 대해 배포 히스토그램을 보고하지 않으면 테이블의 행에 값이 고르게 분산된 것처럼 최적화 프로그램이 작동합니다.
SQL Server는 OLE DB 공급자의 다음 확장 프로그램을 사용하여 배포 통계를 보고합니다.
데이터 원본 속성 DBPROP_TABLESTATISTICS는 공급자가 배포 통계를 보고하는지 여부를 나타냅니다.
IDBSchemaRowset인 TABLE_STATISTICS는 지정된 기본 테이블에 사용할 수 있는 통계를 나열합니다. 여기에는 열 및 행 카디널리티가 포함됩니다.
IOpenRowset::OpenRowset은 통계를 식별하는 인수를 사용합니다. 통계가 지정되면 OpenRowset이 StatisticID에 지정된 통계가 적용된 첫 번째 열의 값 배포를 보여 주는 히스토그램 행 집합을 반환합니다.
OLE DB에 대한 이러한 확장 프로그램은 OLE DB 버전 2.6 이상에 들어 있습니다. 배포 통계에 관한 이러한 확장 프로그램에 대한 자세한 내용은 OLE DB 2.6 사양을 참조하십시오.
OLE DB 공급자는 기본 테이블의 행 일부만 샘플링하는 성능 향상을 구현하도록 선택하여 배포 통계 및 히스토그램을 결정할 수 있습니다. 이러한 공급자는 TABLE_STATISTICS와 히스토그램 행 집합에 보고하기 전에 테이블의 총 값을 반영할 수 있도록 카디널리티와 히스토그램 데이터를 확장해야 합니다.
OLE DB 공급자가 TABLE_STATISTICS의 데이터와 히스토그램 행 집합을 기본 테이블의 현재 내용과 최신 상태로 유지하는지 여부는 정의된 구현입니다.
[!참고]
연결된 서버의 테이블을 사용하는 경우 최상의 쿼리 계획을 만들려면 쿼리 프로세서가 연결된 서버에서 데이터 배포 통계를 가져와야 합니다. 테이블의 열에 대해 제한된 사용 권한을 가진 사용자는 유용한 모든 통계를 가져올 권한이 없으므로 덜 효율적인 쿼리 계획을 받게 되어 성능 저하 문제를 겪을 수 있습니다. 연결된 서버가 SQL Server의 인스턴스인 경우 사용 가능한 모든 통계를 가져오려면 사용자가 해당 테이블의 소유자이거나 연결된 서버의 sysadmin 고정 서버 역할, db_owner 고정 데이터베이스 역할 또는 db_ddladmin 고정 데이터베이스 역할의 멤버여야 합니다.