SQL Server가 fullscan 이외의 다른 통계로 이러한 통계 업데이트를 거부하는 이유는 무엇입니까?


13

일일 데이터웨어 하우스 빌드에서 비교적 오래 실행되는 (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으로 업그레이드 한 후 문제가 해결되었습니다.

답변:


10

내가 시도 할 첫 번째 것은 SP1 CU16에서 현재 QFE로 SQL Server 인스턴스를 SP3 CU1 (현재 2012 빌드)로 업데이트 한 다음 동작이 동일한 지 다시 테스트하는 것입니다.

예를 들면 다음과 같습니다.

FIX : UPDATE STATISTICS가 SQL Server에서 columnstore 인덱스가있는 테이블에 대해 잘못된 샘플링 및 처리를 수행함

SP2 CU2에서 처음 릴리스 된 것은 관련이있을 수 있습니다.

즉, 2012 columnstore가 샘플링 된 통계에 필요한 tablesample을 지원했는지 확실하지 않습니다. 질문에 재현 할 수있게되면이 답변을 업데이트하겠습니다.


1
(마지막 단락과 관련하여) SELECT WebAnalyticsId, MarketKey from [dbo].[factWebAnalytics] TABLESAMPLE (897667 ROWS) ORDER BY MarketKey, WebAnalyticsId30 초 이내에 실행됩니다. 그래도 columnstore 인덱스를 사용하지 않습니다. 클러스터형 인덱스를 사용합니다.
Martin Smith

2
예, 확실히 이후 버전에서 수정 된 것처럼 보입니다. pastebin.com/7f4TwmKW 에서 간단한 재현을 생성했으며 11.0.5343.0을 실행하는 테스트 서버에서 10,000 행의 샘플 크기에 대한 요청이 무시되고 8,000,000 개의 행이 모두 샘플링되었습니다. i.stack.imgur.com/DbbjZ.png (계획 질문에있는 것과 거의 동일합니다.)하지만 Microsoft SQL Server 2012 (SP3) (KB3072779)-11.0.6020.0 (예상 행 수는 274,649로 추정됩니다. 이전 빌드 및 계획은 컬럼 스토어가 아닌 CI를 사용합니다.)
Martin Smith
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.