2011-10-04 2 views
4

나는 파티션이 될 테이블을 만들고 FILESTREAM 열을 포함하고 있습니다. 내가 만나는 문제는 FILE_UPLOADED_DATE이 내 파티션 구성표의 일부이기 때문에 복합 기본 키 (FILE_IDFILE_UPLOADED_DATE)가 있어야한다는 것입니다. 그 맞습니까? 나는 이것이 복합 키가 아니며 단순히 FILE_ID이 기본 키가되는 것을 선호합니다 ..... 이것이 단지 사용자 오류 일 수 있습니까?SQL Server의 기본 키 (파티션 문제 포함)

의견을 보내 주시면 감사하겠습니다.

버전 : SQL 서버 2008 R2

파티션 구성표 및 기능 :

CREATE PARTITION FUNCTION DocPartFunction (datetime) 
AS RANGE RIGHT FOR VALUES ('20101220') 
GO 
CREATE PARTITION SCHEME DocPartScheme AS 
PARTITION DocPartFunction TO (DATA_FG_20091231, DATA_FG_201); 
GO 
CREATE PARTITION SCHEME DocFSPartScheme AS 
PARTITION DocPartFunction TO (FS_FG_20091231,FS_FG_201); 
GO 

만들기 진술 :

CREATE TABLE [dbo].[FILE](
    [FILE_ID] [int] IDENTITY(1,1) NOT NULL, 
    [DOCUMENT] [varbinary](max) FILESTREAM NULL, 
    [FILE_UPLOADED_DATE] [datetime] NOT NULL, 
    [FILE_INT] [int] NOT NULL, 
    [FILE_EXTENSION] [varchar](10) NULL, 
    [DocGUID] [uniqueidentifier] ROWGUIDCOL NOT NULL UNIQUE ON [PRIMARY], 
CONSTRAINT [PK_File] PRIMARY KEY CLUSTERED 
    ( [FILE_ID] ASC 
    ) ON DocPartScheme ([FILE_UPLOADED_DATE]) 
)ON DocPartScheme ([FILE_UPLOADED_DATE]) 
FILESTREAM_ON DocFSPartScheme; 

오류 내가 포함하지 않는 경우 FILE_UPLOADED_DATE :

Msg 1908, Level 16, State 1, Line 1 
Column 'FILE_UPLOADED_DATE' is partitioning column of the index 'PK_File'. Partition columns for a unique index must be a subset of the index key. 
Msg 1750, Level 16, State 0, Line 1 
Could not create constraint. See previous errors. 

고마워요!

답변

8

기본 키와 클러스터 된 인덱스를 혼동스럽게합니다. 두 사람이 동일하고 동일 할 이유는 없습니다. FILE_UPLOADED_DATE에 클러스터 된 인덱스를 사용하고 클러스터되지 않은 별개의 기본 키를 FILE_ID에 만들 수 있습니다. 사실 당신은 이미 DocGUID 열의 비슷한 작업을 수행합니다

CREATE TABLE [dbo].[FILE](
    [FILE_ID] [int] IDENTITY(1,1) NOT NULL, 
    [DOCUMENT] [varbinary](max) FILESTREAM NULL, 
    [FILE_UPLOADED_DATE] [datetime] NOT NULL, 
    [FILE_INT] [int] NOT NULL, 
    [FILE_EXTENSION] [varchar](10) NULL, 
    [DocGUID] [uniqueidentifier] ROWGUIDCOL NOT NULL, 
    constraint UniqueDocGUID UNIQUE NONCLUSTERED ([DocGUID]) 
     ON [PRIMARY]) 
    ON DocPartScheme ([FILE_UPLOADED_DATE]) 
    FILESTREAM_ON DocFSPartScheme; 

CREATE CLUSTERED INDEX cdx_File 
    ON [FILE] (FILE_UPLOADED_DATE) 
    ON DocPartScheme ([FILE_UPLOADED_DATE]) 
    FILESTREAM_ON DocFSPartScheme; 

ALTER TABLE [dbo].[FILE] 
    ADD CONSTRAINT PK_File PRIMARY KEY NONCLUSTERED (FILE_ID) 
    ON [PRIMARY]; 

그러나 이러한 디자인은 매우 심각한 성능 문제를 야기하고, 또한 모든 빠른 파티션 전환 작업을 차단할 수 있습니다 비 정렬 인덱스로 이어질 것입니다. Special Guidelines for Partitioned Indexes을 참조하십시오.

각 정렬 테이블에는 최소 메모리가 필요합니다. 이 기본 테이블과 정렬 된 파티션 된 인덱스를 빌드 할 때 정렬 테이블은 적은 메모리를 사용하여 한 번에 하나씩 빌드됩니다. 그러나 정렬되지 않은 분할 된 인덱스를 작성할 때 정렬 테이블은 동시에 빌드 된 입니다.

결과적으로 이러한 동시 정렬을 처리하는 데 충분한 메모리가 있어야합니다. 파티션 수가 많을수록 더 많은 메모리가 필요합니다. 각 파티션에 대한 각 정렬 테이블의 최소 크기는 40 페이지이고 페이지 당 8 킬로바이트입니다. 예를 들어 정렬되지 않은 분할 된 인덱스와 100 개의 분할 영역은 에 4,000 (40 * 100) 페이지를 동시에 직렬 정렬하기에 충분한 메모리가 필요합니다. 이 메모리가 이면 사용할 수 있지만 빌드 작업은 성공하지만 성능은 일 수 있습니다. 이 메모리를 사용할 수없는 경우 빌드 작업이 실패합니다.

디자인에 이미 DocGUID에 대해 정렬되지 않은 색인이있어 성능 문제가 이미 존재할 가능성이 큽니다.인덱스를 정렬 된 상태로 유지해야하는 경우 파티션 구성표를 선택하면 부작용 중 하나를 인정해야합니다. 키에 분할 키가 포함되어 있지 않으면 논리 기본 키 또는 고유 제한 적용을 더 이상 가질 수 없습니다.

그리고 마침내 질문해야합니다. 왜 분할 된 테이블을 사용해야합니까? 그들은 항상으로 분할되지 않은 대안보다 느립니다. ETL에 대한 빠른 파티션 전환 작업 (DocGUID의 정렬되지 않은 색인으로 인해 이미 처리 중임)을 필요로하지 않는다면 기본적으로 분할 된 테이블을 사용할 동기가 없습니다. (선점 논평 : FILE_UPLOADED_DATE의 클러스터 드 인덱스는 '파티션 제거'보다 나은 대안입니다).

+0

Remus, 정말 고마워요. 파일 영역 파일 그룹을 다른 위치로 가져갈 수 있도록 파티션이 필요합니다 ..... 그러나 공간 제한이 있기 때문에 최신 파일 만 ... 긴 스토리. – scarpacci

+0

위의 해결책이 작동하지 않습니까? 그 중 일부는 예약어 "FILE_ID"로 인해 있었지만 위의 구조로 테이블을 만들려고 할 때 여전히 오류가 발생하는 것을 수정 한 후에 수정했습니다. – scarpacci

+0

스크립트를 수정했습니다 (이번에 테스트). 파티션을 파일 그룹 관리에 사용하는 것이 파티션을 배포해야하는 타당한 이유입니다. 유감스럽게도 ROWGUIDCOL의 고유 제약 조건에 대한 FILESTREAM 요구 사항은 정렬되지 않은 인덱스가 보장되어 있으므로 향후에 문제가 발생할 수 있습니다 (예 : 빠른 파티션 스위치를 사용하여 최대 보존 기간 정책 기간을 연장 한 문서를 삭제해야하는 경우). –

4

분할 된 열은 항상 분할 된 테이블의 클러스터 된 인덱스에 있어야합니다. 해결 방법은이 문제를 해결해야합니다.

0

나는 그 오래된 질문을 알고 있지만, 어쩌면 구글이 질문에 다른 사람을 리드 :

가능한 솔루션은 날짜 열이 아니라 FILE_ID에 의해 분할하지 않을 것입니다. 매일/주/월 (또는 사용하는 시간대) 자정에 Max(File_ID)file_uploadet_date < GetDate()이있는 에이전트 작업을 실행하고 다음 파일 그룹을 파티션 구성표에 추가하고 MaxID + 1에서 분할을 수행해야합니다.

물론 고유 식별자가 아닌 file_id을이 고유 색인에 추가하거나 고유하지 않은 DocIds를 만들거나 삽입/업데이트의 고유성을 검사한다는 점을 제외하면 DocID의 정렬되지 않은 색인에 문제가있을 수 있습니다. 방아쇠.