일일 데이터웨어 하우스 빌드에서 비교적 오래 실행되는 (20 분 이상) 자동 업데이트 통계 작업을 발견했습니다. 관련된 테이블은
CREATE TABLE [dbo].[factWebAnalytics](
[WebAnalyticsId] [bigint] IDENTITY(1,1) NOT NULL,
[MarketKey] [int] NOT NULL CONSTRAINT [DF_factWebAnalytics_MarketKey] DEFAULT ((-1)),
/*Other columns removed*/
CONSTRAINT [PK_factWebAnalytics] PRIMARY KEY CLUSTERED
(
[MarketKey] ASC,
[WebAnalyticsId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [MarketKeyPS]([MarketKey])
) ON [MarketKeyPS]([MarketKey])
Microsoft SQL Server 2012 (SP1)-11.0.3513.0 (X64)에서 실행되므로 쓰기 가능한 columnstore 인덱스를 사용할 수 없습니다.
이 테이블에는 두 개의 서로 다른 마켓 키에 대한 데이터가 포함되어 있습니다. 빌드는 특정 MarketKey의 파티션을 준비 테이블로 전환하고, 열 저장소 인덱스를 비활성화하고, 필요한 쓰기를 수행하고, 열 저장소를 다시 빌드 한 다음 다시 전환합니다.
업데이트 통계의 실행 계획에 따르면 테이블에서 모든 행을 가져 와서 정렬하고, 예상 행 수를 잘못 잘못 확인하고 유출 tempdb
수준 2로 유출됩니다.
달리는
SELECT [s].[name] AS "Statistic",
[sp].*
FROM [sys].[stats] AS [s]
OUTER APPLY sys.dm_db_stats_properties ([s].[object_id], [s].[stats_id]) AS [sp]
WHERE [s].[object_id] = OBJECT_ID(N'[dbo].[factWebAnalytics]');
쇼
명시 적으로 해당 인덱스 통계의 샘플 크기를 다른 사람이 사용하는 통계로 축소하려고하면
UPDATE STATISTICS [dbo].[factWebAnalytics] [PK_factWebAnalytics] WITH SAMPLE 897667 ROWS
쿼리는 20 분 이상 다시 실행되며 실행 계획은 요청 된 897,667 샘플이 아닌 모든 행을 처리하고 있음을 보여줍니다.
이 모든 것의 끝에서 생성 된 통계는 그다지 흥미롭지 않으며 전체 스캔에 소요 된 시간을 보증하지는 않습니다.
Statistics for INDEX 'PK_factWebAnalytics'.
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Name Updated Rows Rows Sampled Steps Density Average Key Length String Index
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
PK_factWebAnalytics Jan 22 2016 11:31AM 420072086 420072086 2 0 12 NO 420072086
All Density Average Length Columns
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
0.5 4 MarketKey
2.380544E-09 12 MarketKey, WebAnalyticsId
Histogram Steps
RANGE_HI_KEY RANGE_ROWS EQ_ROWS DISTINCT_RANGE_ROWS AVG_RANGE_ROWS
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1 0 3.441652E+08 0 1
2 0 7.590685E+07 0 1
이 동작이 발생하는 이유와 이러한 동작을 사용 NORECOMPUTE
하는 것 외에 어떤 조치를 취할 수 있습니까?
재현 스크립트 는 여기에 있습니다 . 단순히 클러스터 된 PK와 columnstore 인덱스가있는 테이블을 만들고 낮은 샘플 크기로 PK 통계를 업데이트하려고합니다. 이것은 분할을 사용하지 않으며 분할 측면이 필요하지 않음을 나타냅니다. 그러나 위에서 설명한 파티셔닝을 사용하면 파티션을 껐다가 다시 변경해도 파티션의 행 수를 두 배로 늘려서 수정 통계 횟수를 늘리므로 통계가 실제로 보장됩니다. 오래된 것으로 간주되고 자동 업데이트됩니다.
KB2986627에 표시된대로 클러스터되지 않은 인덱스를 테이블에 추가하려고 시도했습니다 (둘 다 행없이 필터링 된 다음 실패하면 필터링되지 않은 NCI도 아무런 영향을 미치지 않음).
재현에는 빌드 11.0.6020.0에서 문제가있는 동작이 표시되지 않았으며 SP3으로 업그레이드 한 후 문제가 해결되었습니다.
SELECT WebAnalyticsId, MarketKey from [dbo].[factWebAnalytics] TABLESAMPLE (897667 ROWS) ORDER BY MarketKey, WebAnalyticsId
30 초 이내에 실행됩니다. 그래도 columnstore 인덱스를 사용하지 않습니다. 클러스터형 인덱스를 사용합니다.