Почему SQL Server отказывается обновлять эти статистические данные, кроме полного сканирования?

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), поэтому доступные для записи индексы хранилища столбцов недоступны.

Таблица содержит данные для двух разных ключей Market. Сборка переключает раздел для определенного MarketKey в промежуточную таблицу, отключает индекс columnstore, выполняет необходимые операции записи, восстанавливает хранилище columns, а затем переключает его обратно.

План выполнения для статистики обновления показывает, что он извлекает все строки из таблицы, сортирует их, получает ошибочно оценочное число строк и выливает их на 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

Первое, что я бы попробовал, - это обновить экземпляр SQL Server с SP1 CU16 с помощью QFE, который у вас есть прямо сейчас, до SP3 CU1 (текущая сборка 2012 года), а затем провести повторное тестирование, чтобы увидеть, является ли поведение таким же.

Например:

ИСПРАВЛЕНИЕ: UPDATE STATISTICS выполняет некорректную выборку и обработку для таблицы с индексом columnstore в SQL Server

... впервые выпущенный в SP2 CU2 может быть актуальным.

Тем не менее, я не уверен, что 2012 columnstore поддерживает шаблон таблицы, необходимый для выборочной статистики. Я обновлю этот ответ, как только в вопросе появится репро.

Пол Уайт 9
источник
1
(Относительно последнего параграфа) SELECT WebAnalyticsId, MarketKey from [dbo].[factWebAnalytics] TABLESAMPLE (897667 ROWS) ORDER BY MarketKey, WebAnalyticsIdпроходит менее чем за 30 секунд для меня. Он не использует индекс columnstore. Он использует кластерный индекс.
Мартин Смит
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, а не columnstore.)
Мартин Смит