UPDATE STATISTICS (Transact-SQL)

Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure конечной точке аналитики платформы Аналитики Azure Synapse Analytics (PDW) в Microsoft Fabric Хранилище в Microsoft Fabric

Обновляет статистику оптимизации запросов для таблицы или индексированного представления. По умолчанию оптимизатор запросов обновляет статистику по мере необходимости для усовершенствования плана запроса. В некоторых случаях можно повысить производительность запроса, выполняя обновление статистики с помощью инструкции UPDATE STATISTICS или хранимой процедуры sp_updatestats чаще, чем это происходит по умолчанию.

Обновление статистики гарантирует, что запросы будут компилироваться с актуальной статистикой. Обновление статистики с помощью любого процесса может привести к автоматической перекомпиляции планов запросов. Рекомендуется не обновлять статистику слишком часто, поскольку необходимо найти баланс в производительности между улучшением планов запросов и потерей времени на их перекомпиляцию. Критерии выбора компромиссного решения зависят от приложения. UPDATE STATISTICS может использовать tempdb для сортировки примеров строк, чтобы создать статистику.

Примечание.

Дополнительные сведения о статистике в Microsoft Fabric см. в разделе "Статистика" в Microsoft Fabric.

Соглашения о синтаксисе Transact-SQL

Синтаксис

-- Syntax for SQL Server and Azure SQL Database  
  
UPDATE STATISTICS table_or_indexed_view_name   
    [   
        {   
            { index_or_statistics__name }  
          | ( { index_or_statistics_name } [ ,...n ] )   
                }  
    ]   
    [    WITH   
        [  
            FULLSCAN   
              [ [ , ] PERSIST_SAMPLE_PERCENT = { ON | OFF } ]    
            | SAMPLE number { PERCENT | ROWS }   
              [ [ , ] PERSIST_SAMPLE_PERCENT = { ON | OFF } ]    
            | RESAMPLE   
              [ ON PARTITIONS ( { <partition_number> | <range> } [, ...n] ) ]  
            | <update_stats_stream_option> [ ,...n ]  
        ]   
        [ [ , ] [ ALL | COLUMNS | INDEX ]   
        [ [ , ] NORECOMPUTE ]   
        [ [ , ] INCREMENTAL = { ON | OFF } ] 
        [ [ , ] MAXDOP = max_degree_of_parallelism ]
        [ [ , ] AUTO_DROP = { ON | OFF } ]
    ] ;  
  
<update_stats_stream_option> ::=  
    [ STATS_STREAM = stats_stream ]  
    [ ROWCOUNT = numeric_constant ]  
    [ PAGECOUNT = numeric_contant ]  
-- Syntax for Azure Synapse Analytics and Parallel Data Warehouse 
  
UPDATE STATISTICS [ schema_name . ] table_name   
    [ ( { statistics_name | index_name } ) ]  
    [ WITH   
       {  
              FULLSCAN   
            | SAMPLE number PERCENT   
            | RESAMPLE   
        }  
    ]  
[;]  
-- Syntax for Microsoft Fabric

UPDATE STATISTICS [ schema_name . ] table_name   
    [ ( { statistics_name } ) ]  
    [ WITH   
       {  
              FULLSCAN   
            | SAMPLE number PERCENT   
        }  
    ]  
[;]  

Примечание.

Этот синтаксис не поддерживается бессерверным пулом SQL в Azure Synapse Analytics.

Аргументы

table_or_indexed_view_name

Имя таблицы или индексированного представления, содержащего статистический объект.

index_or_statistics_name или statistics_name | index_name или statistics_name

Имя индекса, для которого обновляется статистика, или имя обновляемой статистики. Если index_or_statistics_name или statistics_name не указано, оптимизатор запросов обновляет всю статистику для таблицы или индексированного представления. Сюда входит статистика, созданная инструкцией CREATE STATISTICS, статистика по отдельным столбцам, созданная при включенном параметре AUTO_CREATE_STATISTICS, и статистика, созданная для индексов.

Дополнительные сведения о AUTO_CREATE_STATISTICS см. в разделе "Параметры ALTER DATABASE SET". Просмотреть все индексы для таблицы или представления можно с помощью процедуры sp_helpindex.

FULLSCAN

Вычисляет статистику путем просмотра всех строк в таблице или индексированном представлении. FULLSCAN и SAMPLE 100 PERCENT имеют одинаковые результаты. FULLSCAN невозможно использовать с параметром SAMPLE.

SAMPLE number { PERCENT | ROWS }

Указывает приблизительное процентное соотношение или число строк в таблице или индексированном представлении для оптимизатора запросов, которые используются при обновлении статистики. Аргумент number для параметра PERCENT может иметь значение от 0 до 100, а для параметра ROWS аргумент number может иметь значение от 0 до общего числа строк. Фактическое процентное соотношение или число строк, отбираемых оптимизатором запросов, может не совпадать с заданным значением. Например, оптимизатор запросов просматривает все строки на странице данных.

Команда SAMPLE полезна в особых случаях, в которых план запроса на основе выборки по умолчанию не является оптимальным. В большинстве случаев нет необходимости использовать команду SAMPLE, так как оптимизатор запросов делает выборку и определяет размер статистически значимой выборки по умолчанию, что требуется для создания высококачественных планов запросов.

Примечание.

В SQL Server 2016 (13.x) при использовании уровня совместимости базы данных 130 выборка данных для создания статистики выполняется параллельно, чтобы повысить производительность сбора статистики. Оптимизатор запросов будет использовать параллельную статистику выборки, когда размер таблицы превышает определенное пороговое значение. Начиная с SQL Server 2017 (14.x), независимо от уровня совместимости базы данных, поведение было изменено обратно на использование последовательной проверки, чтобы избежать потенциальных проблем с производительностью с чрезмерными ожиданиями LATCH. Остальная часть плана запроса при обновлении статистики будет поддерживать параллельное выполнение при необходимости.

SAMPLE невозможно использовать вместе с параметром FULLSCAN. Если не указана ни одна из команд SAMPLE или FULLSCAN, оптимизатор запросов использует выбранные данные и вычисляет размер выборки по умолчанию.

Не рекомендуется указывать значения 0 PERCENT и 0 ROWS. Если для PERCENT или ROWS указано значение 0, объект статистики будет обновлен без статистических данных.

Для большинства рабочих нагрузок полная проверка не требуется, достаточно выборки по умолчанию. Тем не менее для некоторых рабочих нагрузок, чувствительных к разнящимся распределениям данных, может потребоваться выборка большего размера или даже полная проверка. Хотя оценки могут стать более точными с полным сканированием, чем выборка сканирования, сложные планы могут существенно не воспользоваться.

Дополнительные сведения см. в разделе "Компоненты и понятия статистики".

RESAMPLE

Обновить каждый объект статистики, используя последнее значение частоты выборки.

Использование RESAMPLE может вызвать просмотр полной таблицы. Например, статистика для индексов использует для частоты выборки просмотр полной таблицы. Если не указан ни один из параметров выборки (SAMPLE, FULLSCAN, RESAMPLE), оптимизатор запросов выполняет выборку данных и вычисляет размер выборки по умолчанию.

В хранилище в Microsoft Fabric RESAMPLE не поддерживается.

PERSIST_SAMPLE_PERCENT = { ON | OFF }

Область применения: SQL Server 2016 (13.x) с пакетом обновления 1 (CU4), SQL Server 2017 (14.x) с пакетом обновления 1 (SP1) или SQL Server 2019 (15.x) и более поздних версий, База данных SQL Azure, Управляемый экземпляр SQL Azure

Если установлено значение ON, статистика будет сохранять заданный процент выборки для последующих обновлений, где явно не указан процент выборки. Если установлено значение OFF, процент выборки статистики будет сбрасываться к значению по умолчанию при последующих обновлениях, где явно не указан процент выборки. Значение по умолчанию — OFF.

Значение сохраненного процента выборки для выбранной статистики отображается в DBCC SHOW_STATISTICS и sys.dm_db_stats_properties.

Если выполняется инструкция AUTO_UPDATE_STATISTICS, используется сохраненный процент выборки, если он указан, или процент выборки по умолчанию, если нет. Этот параметр не влияет на поведение RESAMPLE.

Если таблица усечена, все статистические данные, построенные на усеченной куче или в дереве B (HoBT), будут возвращаться к использованию процента выборки по умолчанию.

Примечание.

В SQL Server при перестроении индекса, который ранее был обновлен с помощью PERSIST_SAMPLE_PERCENT, сохраненный процент выборки возвращается по умолчанию. Начиная с SQL Server 2016 (13.x) с пакетом обновления 2 (SP2) CU17, SQL Server 2017 (14.x) CU26 и SQL Server 2019 (15.x) CU10, сохраняемый процент выборки сохраняется даже при перестроении индекса.

ON PARTITIONS ( { <partition_number> | <range> } [, ...n] ) ]

Область применения: SQL Server 2014 (12.x) и более поздних версий

Принудительно выполняет перекомпитирование статистики конечного уровня, охватывающих секции, указанные в предложении ON PARTITIONS, а затем объединяется для создания глобальной статистики. WITH RESAMPLE является обязательным параметром, потому что статистики секции, созданные с различной частотой выборки, нельзя объединить.

ALL | COLUMNS | INDEX

Обновить всю существующую статистику, созданную по одному или нескольким столбцам, или статистику, созданную для индексов. Если не указан ни один параметр, инструкция UPDATE STATISTICS обновляет всю статистику для таблицы или индексированного представления.

NORECOMPUTE

Отключить параметр автоматического обновления статистики AUTO_UPDATE_STATISTICS для указанной статистики. Если указан этот параметр, оптимизатор запросов завершает текущее обновление статистики и отключает обновление в будущем.

Чтобы повторно включить поведение параметра AUTO_UPDATE_STATISTICS, запустите UPDATE STATISTICS еще раз без параметра NORECOMPUTE или запуска sp_autostats.

Предупреждение

Использование этого параметра может привести к созданию неоптимальных планов запросов. Рекомендуется ограничить использование этого параметра, причем использовать его надлежит только опытным системным администраторам.

Дополнительные сведения о параметре AUTO_STATISTICS_UPDATE см. в разделе "Параметры ALTER DATABASE SET".

INCREMENTAL = { ON | OFF }

Область применения: SQL Server 2014 (12.x) и более поздних версий

При значении ON статистики повторно создаются как статистики отдельно по секциям. При отключении дерева статистики удаляется, а SQL Server повторно вычисляет статистику. Значение по умолчанию — OFF.

Если статистики по секциям не поддерживаются, возвращается ошибка. Добавочные статистики не поддерживаются для следующих типов статистических данных:

  • Статистики, созданные с индексами, не выравненными по секциям для базовой таблицы.
  • Статистики, созданные в доступных для чтения базах данных-получателях AlwaysOn.
  • Статистики, созданные в базах данных, доступных только для чтения.
  • Статистики, созданные по фильтрованным индексам.
  • Статистика, созданная по представлениям.
  • Статистики, созданные по внутренним таблицам.
  • Статистики, созданные с пространственными индексами или XML-индексами.

MAXDOP = max_degree_of_parallelism

Область применения: SQL Server (начиная с SQL Server 2016 (13.x) с пакетом обновления 2 (SP2) и SQL Server 2017 (14.x) CU3).

Переопределяет параметр конфигурации max degree of parallelism на время выполнения операции со статистикой. Дополнительные сведения см. в разделе Настройка параметра конфигурации сервера max degree of parallelism. MAXDOP можно использовать для ограничения числа процессоров, используемых при параллельном выполнении планов. Максимальное число процессоров — 64.

Параметр max_degree_of_parallelism может иметь одно из следующих значений:

1
Подавляет формирование параллельных планов.

>1 — ограничивает максимальное количество процессоров, используемых в параллельных операциях со статистиками, заданным или меньшим числом в зависимости от текущей рабочей нагрузки системы;

0 (по умолчанию)
В зависимости от текущей рабочей нагрузки системы использует реальное или меньшее число процессоров.

update_stats_stream_option

Указано только в ознакомительных целях. Не поддерживается. Совместимость с будущими версиями не гарантируется.

AUTO_DROP = { ON | OFF }

Область применения: SQL Server 2022 (16.x) и более поздних версий.

В настоящее время, если статистика создается сторонним инструментом в клиентской базе данных, то объекты статистики могут блокировать или вмешиваться в необходимые клиенту изменения в схеме.

(Начиная с SQL Server 2022 (16.x)) | Эта возможность позволяет создавать объекты статистики в таком режиме, что изменение в схеме не блокируется статистикой (вместо этого статистика удаляется). В этом случае статистика с автоматическим удалением работает так же, как статистика с автоматической генерацией.

Примечание.

При попытке задать или отменить свойство Auto_Drop для статистики с автоматической генерацией могут возникать ошибки — в такой статистике всегда используется автоматическое удаление. В некоторых резервных копиях при восстановлении это свойство может быть настроено неправильно вплоть до следующего обновления объекта статистики (вручную или автоматически). В этом случае статистика с автоматической генерацией работает как статистика с автоматическим удалением.

Замечания

Обновление СТАТИСТИКИ

Дополнительные сведения об использовании UPDATE STATISTICSсм. в разделе "Когда следует обновить статистику".

Ограничения

  • Обновление статистики во внешних таблицах не поддерживается. Для обновления статистики во внешней таблице удалите и повторно создайте статистику.
  • Параметр MAXDOP несовместим с параметрами STATS_STREAM, ROWCOUNT и PAGECOUNT.
  • Параметр MAXDOP ограничивается параметром MAX_DOP группы рабочей нагрузки Resource Governor (если применимо).

Обновление всей статистики с помощью sp_updatestats

Сведения об обновлении статистики для всех пользовательских и внутренних таблиц в базе данных см. в sp_updatestats хранимой процедуры. Например, следующая команда вызывает sp_updatestats обновление всей статистики для базы данных.

EXEC sp_updatestats;  

Автоматическое управление индексами и статистикой

Используйте такие решения, как Адаптивная дефрагментация индексов, чтобы автоматически управлять дефрагментацией индексов и обновлениями статистики для одной базы данных или нескольких. Эта процедура автоматически выбирает, следует ли перестроить или реорганизовать индекс, сверяясь с уровнем фрагментации и другими параметрами, и обновляет статистику на основе линейных пороговых значений.

Определение времени последнего обновления статистики

Чтобы определить время последнего обновления статистики, используйте функцию STATS_DATE .

PDW/Azure Synapse Analytics

Следующий синтаксис не поддерживается системой платформы Аналитики (PDW) или Azure Synapse Analytics:

UPDATE STATISTICS t1 (a,b);   
UPDATE STATISTICS t1 (a) WITH SAMPLE 10 ROWS;  
UPDATE STATISTICS t1 (a) WITH NORECOMPUTE;  
UPDATE STATISTICS t1 (a) WITH INCREMENTAL = ON;  
UPDATE STATISTICS t1 (a) WITH stats_stream = 0x01;  

Разрешения

Необходимо разрешение ALTER для таблицы или представления.

Примеры

А. Обновление всей статистики для таблицы

В следующем примере обновляется вся статистика в таблице SalesOrderDetail.

USE AdventureWorks2022;  
GO  
UPDATE STATISTICS Sales.SalesOrderDetail;  
GO  

B. Обновление статистики для индекса

В следующем примере обновляется статистика для индекса AK_SalesOrderDetail_rowguid в таблице SalesOrderDetail.

USE AdventureWorks2022;  
GO  
UPDATE STATISTICS Sales.SalesOrderDetail AK_SalesOrderDetail_rowguid;  
GO  

C. Обновление статистики с применением 50-процентной выборки

В следующем примере создается, а затем обновляется статистика для столбцов Name и ProductNumber в таблице Product.

USE AdventureWorks2022;
GO  
CREATE STATISTICS Products
    ON Production.Product ([Name], ProductNumber)
    WITH SAMPLE 50 PERCENT
-- Time passes. The UPDATE STATISTICS statement is then executed.
UPDATE STATISTICS Production.Product(Products)
    WITH SAMPLE 50 PERCENT;

D. Обновление статистики с использованием параметров FULLSCAN и NORECOMPUTE

В следующем примере обновляется статистика Products в таблице Product, принудительно запускается полный просмотр всех строк таблицы Product и отключается автоматическое обновление статистики Products.

USE AdventureWorks2022;  
GO  
UPDATE STATISTICS Production.Product(Products)  
    WITH FULLSCAN, NORECOMPUTE;  
GO  

Примеры: Azure Synapse Analytics и система платформы аналитики (PDW)

Е. Обновление статистики для таблицы

В следующем примере обновляется статистика CustomerStats1 в таблице Customer.

UPDATE STATISTICS Customer (CustomerStats1);  

F. Обновление статистики с помощью полной проверки

В следующем примере обновляется статистика CustomerStats1 на основе проверки всех строк в таблице Customer.

UPDATE STATISTICS Customer (CustomerStats1) WITH FULLSCAN;  

G. Обновление всей статистики для таблицы

В следующем примере обновляется вся статистика в таблице Customer.

UPDATE STATISTICS Customer;

H. Использование инструкции CREATE STATISTICS с AUTO_DROP

Чтобы использовать статистику автоматического удаления, просто добавьте следующее в предложение WITH для создания или обновления статистики.

UPDATE STATISTICS Customer (CustomerStats1) WITH AUTO_DROP = ON