Я помітив відносно тривалий (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 в таблицю інсценізації, відключає індекс стовпців стовпців, виконує необхідні записи, відновлює стовпчик стовпців, а потім повертає його назад.
План виконання статистики оновлення показує, що він витягує всі рядки з таблиці, сортує їх, отримує оцінну кількість рядків сильно неправильних і переливається на 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
цих?
Сценарій дозволу є тут . Він просто створює таблицю з кластеризованим ПК та індексом стовпців і намагається оновити статистику ПК із малим розміром вибірки. При цьому не використовується розділення - показує, що аспект розділення не потрібен. Однак використання описаного вище розділення робить все гірше, оскільки вимикання розділу та його повернення назад (навіть без будь-яких інших змін) збільшить модифікацію_counter вдвічі більше рядків у розділі, таким чином, практично гарантуючи, що статистика буде вважається несвіжим і оновленим автоматично.
Я спробував додати некластеризований індекс до таблиці, як зазначено в KB2986627 (обидва відфільтровано без рядків, а потім, коли це не вдалося, нефільтрований NCI також без ефекту).
Repro не показав проблематичну поведінку при складанні 11.0.6020.0, і після оновлення до SP3 проблема тепер виправлена.
SELECT WebAnalyticsId, MarketKey from [dbo].[factWebAnalytics] TABLESAMPLE (897667 ROWS) ORDER BY MarketKey, WebAnalyticsId
для мене працює менше ніж 30 секунд. Однак він не використовує індекс стовпців. Він використовує кластерний індекс.