SQL Server 2005
900M 레코드 테이블에서 약 350M 레코드를 지속적으로 처리 할 수 있어야합니다. 처리 할 레코드를 선택하는 데 사용하는 쿼리는 처리 할 때 잘못 조각화되며 인덱스를 다시 작성하기 위해 처리를 중지해야합니다. 의사 데이터 모델 및 쿼리 ...
/**************************************/
CREATE TABLE [Table]
(
[PrimaryKeyId] [INT] IDENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED,
[ForeignKeyId] [INT] NOT NULL,
/* more columns ... */
[DataType] [CHAR](1) NOT NULL,
[DataStatus] [DATETIME] NULL,
[ProcessDate] [DATETIME] NOT NULL,
[ProcessThreadId] VARCHAR (100) NULL
);
CREATE NONCLUSTERED INDEX [Idx] ON [Table]
(
[DataType],
[DataStatus],
[ProcessDate],
[ProcessThreadId]
);
/**************************************/
/**************************************/
WITH cte AS (
SELECT TOP (@BatchSize) [PrimaryKeyId], [ProcessThreadId]
FROM [Table] WITH ( ROWLOCK, UPDLOCK, READPAST )
WHERE [DataType] = 'X'
AND [DataStatus] IS NULL
AND [ProcessDate] < DATEADD(m, -2, GETDATE()) -- older than 2 months
AND [ProcessThreadId] IS NULL
)
UPDATE cte
SET [ProcessThreadId] = @ProcessThreadId;
SELECT * FROM [Table] WITH ( NOLOCK )
WHERE [ProcessThreadId] = @ProcessThreadId;
/**************************************/
데이터 내용 ...
[DataType] 열이 CHAR (1)로 입력되는 동안 모든 레코드의 약 35 %가 'X'와 같고 나머지는 'A'입니다.
[DataType]이 'X'인 레코드 중 약 10 %는 NOT NULL [DataStatus] 값을 갖습니다.
처리 된 모든 레코드에 대해 [ProcessDate] 및 [ProcessThreadId] 열이 업데이트됩니다.
[DataType] 열이 10 % 정도 업데이트됩니다 ( 'X'가 'A'로 변경됨).
[DataStatus] 열이 시간의 1 % 미만으로 업데이트됩니다.
지금은 해결책이 별도의 처리 테이블로 처리 할 모든 레코드의 기본 키를 선택하는 것입니다. 키를 처리 할 때 키를 삭제하여 인덱스 조각으로 레코드 수를 줄입니다.
그러나 이것은 수동으로 개입하지 않고 상당한 다운 타임없이 이러한 데이터를 지속적으로 처리 할 수 있도록 원하는 워크 플로에 맞지 않습니다. 하우스 키핑 작업에 대해 분기별로 다운 타임이 예상됩니다. 그러나 이제 별도의 처리 테이블이 없으면 조각화가 인덱스를 중지하고 다시 작성해야 할 정도로 나 빠지지 않으면 데이터 세트의 절반까지 처리 할 수 없습니다.
인덱싱 또는 다른 데이터 모델에 대한 권장 사항이 있습니까? 조사해야 할 패턴이 있습니까?
데이터 모델과 프로세스 소프트웨어를 완전히 제어 할 수 있으므로 테이블에서 아무것도 나오지 않습니다.