증분 통계를 사용하는 큰 파티션 된 SQL Server 데이터베이스가 있습니다. 모든 인덱스가 분할되어 정렬됩니다. 파티션별로 파티션을 온라인으로 재구성하려고하면 인덱스가 재구성 된 후 모든 통계가 사라집니다.
다음은 AdventureWorks2014 데이터베이스를 사용하여 SQL Server 2014에서 문제를 복제하는 스크립트입니다.
--Example against AdventureWorks2014 Database
CREATE PARTITION FUNCTION TransactionRangePF1 (DATETIME)
AS RANGE RIGHT FOR VALUES
(
'20130501', '20130601', '20130701', '20130801',
'20130901', '20131001', '20131101', '20131201',
'20140101', '20140201', '20140301'
);
GO
CREATE PARTITION SCHEME TransactionsPS1 AS PARTITION TransactionRangePF1 TO
(
[PRIMARY], [PRIMARY], [PRIMARY], [PRIMARY], [PRIMARY],
[PRIMARY], [PRIMARY], [PRIMARY], [PRIMARY], [PRIMARY],
[PRIMARY], [PRIMARY], [PRIMARY]
);
GO
CREATE TABLE dbo.TransactionHistory
(
TransactionID INT NOT NULL, -- not bothering with IDENTITY here
ProductID INT NOT NULL,
ReferenceOrderID INT NOT NULL,
ReferenceOrderLineID INT NOT NULL DEFAULT (0),
TransactionDate DATETIME NOT NULL DEFAULT (GETDATE()),
TransactionType NCHAR(1) NOT NULL,
Quantity INT NOT NULL,
ActualCost MONEY NOT NULL,
ModifiedDate DATETIME NOT NULL DEFAULT (GETDATE()),
CONSTRAINT CK_TransactionType
CHECK (UPPER(TransactionType) IN (N'W', N'S', N'P'))
)
ON TransactionsPS1 (TransactionDate);
INSERT INTO dbo.TransactionHistory
SELECT * FROM Production.TransactionHistory
-- SELECT * FROM sys.partitions
-- WHERE object_id = OBJECT_ID('dbo.TransactionHistory');
CREATE NONCLUSTERED INDEX IDX_ProductId ON dbo.TransactionHistory (ProductId)
WITH (DATA_COMPRESSION = ROW, STATISTICS_INCREMENTAL=ON)
ON TransactionsPS1 (TransactionDate)
DBCC SHOW_STATISTICS('dbo.TransactionHistory', IDX_ProductId);
PRINT 'Stats are avialable'
ALTER INDEX [IDX_ProductId] ON [dbo].[TransactionHistory] REBUILD
PARTITION = 9 WITH (ONLINE = ON , DATA_COMPRESSION = ROW)
PRINT 'After online index rebuild by partition stats are now gone'
DBCC SHOW_STATISTICS('dbo.TransactionHistory', IDX_ProductId);
PRINT 'Rebuild the stats with a rebuild for all paritions (this works)'
ALTER INDEX [IDX_ProductId] ON [dbo].[TransactionHistory] REBUILD
PARTITION = ALL WITH (ONLINE = ON , DATA_COMPRESSION = ROW,
STATISTICS_INCREMENTAL = ON)
PRINT 'Stats are back'
DBCC SHOW_STATISTICS('dbo.TransactionHistory', IDX_ProductId);
PRINT 'Works correctly for an offline rebuild by partition'
ALTER INDEX [IDX_ProductId] ON [dbo].[TransactionHistory] REBUILD
PARTITION = 9 WITH (ONLINE = OFF , DATA_COMPRESSION = ROW)
--stats still there
DBCC SHOW_STATISTICS('dbo.TransactionHistory', IDX_ProductId);
ALTER INDEX [IDX_ProductId] ON [dbo].[TransactionHistory] REBUILD
PARTITION = 9 WITH (ONLINE = ON , DATA_COMPRESSION = ROW)
DBCC SHOW_STATISTICS('dbo.TransactionHistory', IDX_ProductId);
PRINT' stats are gone!!!!!!'
표시된 것처럼 인덱스에 대한 모든 통계를 잃지 않으면 서 온라인 파티션으로 인덱스를 다시 작성할 수 없습니다. 이것은 우리에게 중요한 유지 관리 문제입니다. 통계 증분 옵션이 단일 인덱스 재 구축 구문의 일부이거나 온라인 옵션이 오프라인 옵션과 마찬가지로 올바르게 처리해야하는 것으로 보입니다.
내가 빠진 것이 있으면 알려주십시오.
업데이트 :
증분 통계가 필요한 한 : 날짜가 아닌 내부 고객 ID로 파티셔닝합니다. 따라서 새로운 클라이언트를 가져 오면 (대규모의 데이터로드) 파티션 통계를 간단히 업데이트하고이 새로운 고객에 대한 추악한 계획을 신속하게 피할 수 있습니다. 나는 그것을 버그로 Microsoft에 제출하고 그들이 무엇을 말해야하는지보고 그 파티션에 대한 통계를 다시 샘플링하는 솔루션과 함께 갈 것이라고 생각합니다.
버그 보고서 연결 :
증분 통계를 사용하여 온라인 인덱스를 재 구축 한 후 통계가 사라짐
업데이트 : Microsoft는 버그임을 확인했습니다.