Чому 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 в таблицю інсценізації, відключає індекс стовпців стовпців, виконує необхідні записи, відновлює стовпчик стовпців, а потім повертає його назад.

План виконання статистики оновлення показує, що він витягує всі рядки з таблиці, сортує їх, отримує оцінну кількість рядків сильно неправильних і переливається на 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 проблема тепер виправлена.

Відповіді:


10

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

Наприклад:

Виправлення: ОНОВЛЕННЯ СТАТИСТИКА виконує неправильну вибірку та обробку для таблиці з індексом стовпців у SQL Server

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

Це означає, що я не впевнений, чи підтримували таблиці стовпців вибірку 2012 року, необхідну для вибіркової статистики. Цю відповідь я оновлю, як тільки запит буде доступний.


1
(Щодо останнього абзацу) SELECT WebAnalyticsId, MarketKey from [dbo].[factWebAnalytics] TABLESAMPLE (897667 ROWS) ORDER BY MarketKey, WebAnalyticsIdдля мене працює менше ніж 30 секунд. Однак він не використовує індекс стовпців. Він використовує кластерний індекс.
Мартін Сміт

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, а не стовпчик.)
Мартін Сміт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.