Я заметил относительно продолжительную (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 проблема теперь исправлена.
SELECT WebAnalyticsId, MarketKey from [dbo].[factWebAnalytics] TABLESAMPLE (897667 ROWS) ORDER BY MarketKey, WebAnalyticsId
проходит менее чем за 30 секунд для меня. Он не использует индекс columnstore. Он использует кластерный индекс.