CREATE STATISTICS (Transact-SQL)
Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure конечную точку аналитики SQL Azure Synapse Analytics в хранилище Microsoft Fabric в Microsoft Fabric
Создает статистику по оптимизации запроса для одного или нескольких столбцов таблицы, индексированного представления или внешней таблицы. Для большинства запросов оптимизатор запросов уже создает необходимую статистику для высококачественного плана запросов; В некоторых случаях необходимо создать дополнительную статистику или CREATE STATISTICS
изменить структуру запроса, чтобы повысить производительность запросов.
Дополнительные сведения см. в разделе Статистика.
Примечание.
Дополнительные сведения о статистике в Microsoft Fabric см. в статье "Статистика в хранилище данных Fabric".
Соглашения о синтаксисе Transact-SQL
Синтаксис
Синтаксис для SQL Server, База данных SQL Azure и Управляемый экземпляр SQL Azure.
-- Create statistics on an external table
CREATE STATISTICS statistics_name
ON { table_or_indexed_view_name } ( column [ , ...n ] )
[ WITH FULLSCAN ] ;
-- Create statistics on a regular table or indexed view
CREATE STATISTICS statistics_name
ON { table_or_indexed_view_name } ( column [ , ...n ] )
[ WHERE <filter_predicate> ]
[ WITH
[ FULLSCAN
[ [ , ] PERSIST_SAMPLE_PERCENT = { ON | OFF } ]
| SAMPLE number { PERCENT | ROWS }
[ [ , ] PERSIST_SAMPLE_PERCENT = { ON | OFF } ]
| <update_stats_stream_option> [ , ...n ]
[ [ , ] NORECOMPUTE ]
[ [ , ] INCREMENTAL = { ON | OFF } ]
[ [ , ] MAXDOP = max_degree_of_parallelism ]
[ [ , ] AUTO_DROP = { ON | OFF } ]
]
];
<filter_predicate> ::=
<conjunct> [ AND <conjunct> ]
<conjunct> ::=
<disjunct> | <comparison>
<disjunct> ::=
column_name IN (constant , ...)
<comparison> ::=
column_name <comparison_op> constant
<comparison_op> ::=
IS | IS NOT | = | <> | != | > | >= | !> | < | <= | !<
<update_stats_stream_option> ::=
[ STATS_STREAM = stats_stream ]
[ ROWCOUNT = numeric_constant ]
[ PAGECOUNT = numeric_constant ]
Синтаксис для Системы платформы Azure Synapse Analytics и Analytics (PDW).
CREATE STATISTICS statistics_name
ON { database_name.schema_name.table_name | schema_name.table_name | table_name }
( column_name [ , ...n ] )
[ WHERE <filter_predicate> ]
[ WITH {
FULLSCAN
| SAMPLE number PERCENT
}
]
[ ; ]
<filter_predicate> ::=
<conjunct> [ AND <conjunct> ]
<conjunct> ::=
<disjunct> | <comparison>
<disjunct> ::=
column_name IN (constant , ...)
<comparison> ::=
column_name <comparison_op> constant
<comparison_op> ::=
IS | IS NOT | = | <> | != | > | >= | !> | < | <= | !<
Синтаксис Для Microsoft Fabric.
CREATE STATISTICS statistics_name
ON { database_name.schema_name.table_name | schema_name.table_name | table_name }
( column_name )
[ WITH {
FULLSCAN
| SAMPLE number PERCENT
}
]
[ ; ]
Аргументы
statistics_name
Имя создаваемой статистики.
table_or_indexed_view_name
Имя таблицы, индексированного представления или внешней таблицы, в которой создается статистика. Чтобы создать статистику для другой базы данных, укажите полное имя таблицы.
column [ ,...n]
Один или несколько столбцов, которые будут включены в статистику. Столбцы должны быть указаны в порядке приоритета слева направо. Для создания гистограммы используется только первый столбец. Для статистики корреляции между столбцами, называемой плотностью, используются все столбцы.
Можно указать любой столбец, который может указываться в качестве ключевого столбца индекса, за исключением следующих столбцов.
Невозможно указать столбцы XML, полнотекстового и FILESTREAM.
Вычисляемые столбцы можно указать только в том случае, если
ARITHABORT
QUOTED_IDENTIFIER
параметры базы данных являютсяON
.Столбцы, имеющие определяемый пользователем тип данных CLR, могут быть указаны, если этот тип поддерживает двоичное упорядочение. Вычисляемые столбцы, определенные как вызовы методов для столбца определяемого пользователем типа, могут быть указаны, если эти методы отмечены как детерминированные.
WHERE <filter_predicate>
Указывает выражение для выбора подмножества строк, которые необходимо включить при создании объекта статистики. Статистика, создаваемая с предикатом фильтра, называется отфильтрованной. Предикат фильтра использует простую логику сравнения и не может ссылаться на вычисляемый столбец, столбец UDT, столбец типа пространственных данных или столбец типа данных hierarchyID . Сравнения, использующие NULL
литералы, не допускаются с операторами сравнения. Используйте вместо них операторы IS NULL
и IS NOT NULL
.
Далее приведено несколько примеров использования предикатов фильтра для таблицы Production.BillOfMaterials
:
WHERE StartDate > '20000101' AND EndDate <= '20000630'
WHERE ComponentID IN (533, 324, 753)
WHERE StartDate IN ('20000404', '20000905') AND EndDate IS NOT NULL
Дополнительные сведения о предикаатах фильтров см. в разделе "Создание отфильтрованных индексов".
FULLSCAN
Область применения: SQL Server 2016 (13.x) с пакетом обновления 1 (SP 4), SQL Server 2017 (14.x) CU 1 и более поздних версий
Вычисляет статистику путем сканирования всех строк. FULLSCAN
и SAMPLE 100 PERCENT
имеют те же результаты. FULLSCAN
нельзя использовать с параметром SAMPLE
.
При опущении SQL Server использует выборку для создания статистики и определяет размер выборки, необходимый для создания плана запросов высокого качества.
В Хранилище в Microsoft Fabric поддерживаются только одноколонок и одноколоночная FULLSCAN
SAMPLE
статистика. Если параметр не включен, SAMPLE
создается статистика.
SAMPLE number { PERCENT | ROWS }
Указывает приблизительный процент или количество строк в таблице или индексированном представлении для оптимизатора запросов, используемого при создании статистики. Для PERCENT
, число может быть от 0 до 100 и ROWS
для , число может быть от 0 до общего числа строк. Фактическое процентное соотношение или число строк, отбираемых оптимизатором запросов, может не совпадать с заданным значением. Например, оптимизатор запросов просматривает все строки на странице данных.
SAMPLE
Полезно для особых случаев, когда план запросов, основанный на выборке по умолчанию, не является оптимальным. В большинстве случаев не обязательно указывать SAMPLE
, так как оптимизатор запросов уже использует выборку и определяет статистически значимый размер выборки по умолчанию, так как требуется для создания планов запросов высокого качества.
SAMPLE
нельзя использовать с параметром FULLSCAN. Если SAMPLE
или FULLSCAN
не указано, оптимизатор запросов использует образец данных и вычисляет размер выборки по умолчанию.
Рекомендуется указывать 0 PERCENT
или 0 ROWS
. 0 ROWS
При 0 PERCENT
указании создается объект статистики, но не содержит статистические данные.
В Хранилище в Microsoft Fabric поддерживаются только одноколонок и одноколоночная FULLSCAN
SAMPLE
статистика. Если параметр не включен, FULLSCAN
создается статистика.
PERSIST_SAMPLE_PERCENT = { ON | OFF }
Если ON
статистика сохраняет процент выборки создания для последующих обновлений, которые явно не указывают процент выборки. Когда OFF
процент выборки статистики сбрасывается до выборки по умолчанию в последующих обновлениях, которые явно не указывают процент выборки. Значение по умолчанию — OFF
.
Примечание.
Если таблица усечена, вся статистика, построенная на усеченном HoBT, вернется к использованию процентного соотношения выборки по умолчанию.
STATS_STREAM = stats_stream
Указано только в ознакомительных целях. Не поддерживается. Совместимость с будущими версиями не гарантируется.
NORECOMPUTE
Отключите параметр AUTO_STATISTICS_UPDATE
автоматического обновления статистики для statistics_name. Если данный параметр определен, оптимизатор запросов завершит любое выполняемое обновление статистики для statistics_name и отключит будущие обновления.
Чтобы повторно включить обновления статистики, удалите статистику с помощью DROP STATISTICS , а затем запустите CREATE STATISTICS
без параметра NORECOMPUTE
.
Предупреждение
При отключении автоматического обновления статистики может препятствовать выбору оптимизатора запросов оптимальных планов выполнения для запросов, включающих таблицу. Этот параметр следует использовать щадя и только квалифицированным администратором базы данных.
Дополнительные сведения о параметре см. в AUTO_STATISTICS_UPDATE
разделе "ПАРАМЕТРЫ ALTER DATABASE SET". Дополнительные сведения об отключении и повторном включении обновления статистики см. в разделе Статистика.
INCREMENTAL = { ON | OFF }
Область применения: SQL Server 2014 (12.x) и более поздних версий
При ON
создании статистики для каждой секции создается статистика. Если OFF
статистика объединяется для всех секций. Значение по умолчанию — OFF
.
Если статистика секции не поддерживается, создается ошибка. Добавочные статистики не поддерживаются для следующих типов статистических данных:
- Статистики, созданные с индексами, не выравненными по секциям для базовой таблицы.
- Статистики, созданные в доступных для чтения базах данных-получателях AlwaysOn.
- Статистики, созданные в базах данных, доступных только для чтения.
- Статистики, созданные по фильтрованным индексам.
- Статистика, созданная по представлениям.
- Статистики, созданные по внутренним таблицам.
- Статистики, созданные с пространственными индексами или XML-индексами.
MAXDOP = max_degree_of_parallelism
Область применения: SQL Server 2016 (13.x) с пакетом обновления 2 (SP 2), SQL Server 2017 (14.x) CU 3 и более поздних версий
Переопределяет параметр конфигурации максимальной степени параллелизма во время статистической операции. Дополнительные сведения см. в разделе "Настройка максимальной степени параллелизма" (параметр конфигурации сервера). Используется MAXDOP
для ограничения количества процессоров, используемых в параллельном выполнении плана. Максимальное число процессоров — 64.
Параметр max_degree_of_parallelism может иметь одно из следующих значений:
1
: подавляет параллельное создание плана.>1
: ограничивает максимальное число процессоров, используемых в параллельной операции индекса, указанным числом.0
(по умолчанию): использует фактическое количество процессоров или меньше на основе текущей системной рабочей нагрузки.
update_stats_stream_option
Указано только в ознакомительных целях. Не поддерживается. Совместимость с будущими версиями не гарантируется.
AUTO_DROP = { ON | OFF }
Область применения: SQL Server 2022 (16.x) и более поздних версий, а также База данных SQL Azure, Управляемый экземпляр SQL Azure
Перед SQL Server 2022 (16.x), если статистика создается пользователем или сторонним инструментом в пользовательской базе данных, эти объекты статистики могут блокировать или вмешиваться в изменения схемы, которые клиент может потребовать.
Начиная с SQL Server 2022 (16.x), AUTO_DROP
параметр включен по умолчанию для всех новых и перенесенных баз данных. Свойство AUTO_DROP
позволяет создавать объекты статистики в режиме, так что последующее изменение схемы не блокируется объектом статистики, но вместо этого статистика удаляется по мере необходимости. Таким образом, вручную созданная статистика с AUTO_DROP
включенным поведением, как автоматическая статистика.
Примечание.
При попытке задать или отменить настройку свойства Auto_Drop в автоматически созданной статистике могут возникнуть ошибки. Автоматически созданная статистика всегда использует автоматическое удаление. Некоторые резервные копии при восстановлении могут неправильно задать это свойство до следующего обновления объекта статистики (вручную или автоматически). Однако автоматически созданная статистика всегда ведет себя как статистика автоматического удаления. При восстановлении базы данных в SQL Server 2022 (16.x) из предыдущей версии рекомендуется выполнить sp_updatestats
в базе данных правильные метаданные для функции статистики AUTO_DROP
.
Дополнительные сведения см. в разделе AUTO_DROP параметра.
Разрешения
Требуются одно из указанных далее разрешений.
ALTER TABLE
- Пользователь является владельцем таблицы
- Членство в предопределенной роли базы данных db_securityadmin
Замечания
SQL Server может использовать tempdb
для сортировки примеров строк перед сборкой статистики.
Статистика для внешних таблиц
При создании статистики по внешней таблице SQL Server импортирует внешнюю таблицу во временную таблицу SQL Server а создает по ней статистику. Для примеров статистики импортируются только строки с выборкой. Если у вас есть большая внешнюю таблицу, это быстрее использовать выборку по умолчанию вместо полного варианта сканирования.
Если внешняя таблица использует DELIMITEDTEXT
, CSV
PARQUET
или DELTA
как типы данных, внешние таблицы поддерживают статистику только для одного столбца для каждой CREATE STATISTICS
команды.
Статистика с отфильтрованным условием
Отфильтрованная статистика может повысить производительность запросов, которые выполняют выборку из четко определенных подмножеств данных. Отфильтрованная статистика использует предикат фильтра в предложении WHERE для выбора подмножества данных, включенных в статистику.
Когда следует использовать CREATE STATISTICS
Дополнительные сведения об условиях использования CREATE STATISTICS
см. в разделе Статистика.
Ссылочные зависимости для отфильтрованной статистики
Представление каталога sys.sql_expression_dependencies представляет каждый столбец в предикате отфильтрованной статистики как ссылаемую зависимость. Перед созданием отфильтрованной статистики рассмотрите операции, выполняемые для столбцов таблиц. Невозможно удалить, переименовать или изменить определение столбца таблицы, определенного в отфильтрованном предикате статистики.
Ограничения
- Обновление статистики во внешних таблицах не поддерживается. Для обновления статистики во внешней таблице удалите и повторно создайте статистику.
- Каждый объект статистики может содержать до 64 столбцов.
- Параметр
MAXDOP
не совместим сSTATS_STREAM
параметрамиROWCOUNT
иPAGECOUNT
параметрами. - Параметр
MAXDOP
ограничивается параметромMAX_DOP
группы рабочей нагрузки Resource Governor (если применимо). CREATE
иDROP STATISTICS
внешние таблицы не поддерживаются в База данных SQL Azure.
Примеры
Примеры кода Transact-SQL в этой статье используют AdventureWorks2022
базу данных или AdventureWorksDW2022
пример базы данных, которую можно скачать с домашней страницы примеров и проектов сообщества Microsoft SQL Server.
А. Использование CREATE STATISTICS с примером числа PERCENT
В следующем примере создается ContactMail1
статистика с помощью случайной Person
выборки 5 процентов BusinessEntityID
и EmailPromotion
столбцов таблицы базы данных AdventureWorks2022.
CREATE STATISTICS ContactMail1
ON Person.Person (BusinessEntityID, EmailPromotion)
WITH SAMPLE 5 PERCENT;
B. Использование CREATE STATISTICS с FULLSCAN и NORECOMPUTE
В следующем примере создается статистика NamePurchase
по всем строкам для столбцов BusinessEntityID
и EmailPromotion
таблицы Person
, при этом автоматический перерасчет статистики блокируется.
CREATE STATISTICS NamePurchase
ON AdventureWorks2022.Person.Person (BusinessEntityID, EmailPromotion)
WITH FULLSCAN, NORECOMPUTE;
В. Создание отфильтрованной статистики с помощью CREATE STATISTICS
В следующем примере создается отфильтрованная статистика ContactPromotion1
. Ядро СУБД отбирает 50 процентов данных и выбирает из них все строки, в которых EmailPromotion
имеет значение 2.
CREATE STATISTICS ContactPromotion1
ON Person.Person (BusinessEntityID, LastName, EmailPromotion)
WHERE EmailPromotion = 2
WITH SAMPLE 50 PERCENT;
GO
D. Создание статистики для внешней таблицы
Помимо указания списка столбцов при создании статистики для внешней таблицы необходимо определить, следует ли создавать статистику с помощью выборки строк или путем сканирования всех строк. CREATE
и DROP STATISTICS
внешние таблицы не поддерживаются в База данных SQL Azure.
Так как SQL Server импортирует данные из внешней таблицы во временную таблицу для создания статистики, полная проверка занимает гораздо больше времени. Для большой таблицы обычно достаточно выполнить выборку по умолчанию.
--Create statistics on an external table and use default sampling.
CREATE STATISTICS CustomerStats1 ON DimCustomer (CustomerKey, EmailAddress);
--Create statistics on an external table and scan all the rows
CREATE STATISTICS CustomerStats1 ON DimCustomer (CustomerKey, EmailAddress) WITH FULLSCAN;
Е. Использование CREATE STATISTICS с FULLSCAN и PERSIST_SAMPLE_PERCENT
В следующем примере показано, как создать NamePurchase
статистику для всех строк в BusinessEntityID
таблице и EmailPromotion
столбцах Person
таблицы, а также задать процент выборки на 100 процентов для всех последующих обновлений, которые явно не указывают процент выборки.
CREATE STATISTICS NamePurchase
ON AdventureWorks2022.Person.Person (BusinessEntityID, EmailPromotion)
WITH FULLSCAN, PERSIST_SAMPLE_PERCENT = ON;
В примерах используется база данных AdventureWorksDW.
F. Создание статистики по двум столбцам
В следующем примере создается статистика CustomerStats1
на основе столбцов CustomerKey
и EmailAddress
таблицы DimCustomer
. Статистика создается на базе статистически значимой выборки строк в таблице Customer
.
CREATE STATISTICS CustomerStats1 ON DimCustomer (CustomerKey, EmailAddress);
G. Создание статистики с помощью полной проверки
В следующем примере создается статистика CustomerStatsFullScan
на основе проверки всех строк в таблице DimCustomer
.
CREATE STATISTICS CustomerStatsFullScan
ON DimCustomer (CustomerKey, EmailAddress) WITH FULLSCAN;
H. Создание статистики путем указания процента выборки
В следующем примере создается статистика CustomerStatsSampleScan
на основе проверки 50 % строк в таблице DimCustomer
.
CREATE STATISTICS CustomerStatsSampleScan
ON DimCustomer (CustomerKey, EmailAddress) WITH SAMPLE 50 PERCENT;
I. Использование CREATE STATISTICS с AUTO_DROP
Чтобы использовать статистику автоматического удаления, просто добавьте следующее в предложение WITH для создания или обновления статистики.
CREATE STATISTICS CustomerStats1 ON DimCustomer (CustomerKey, EmailAddress) WITH AUTO_DROP = ON
Чтобы оценить параметр автоматического удаления для существующей статистики, используйте auto_drop
столбец в sys.stats:
SELECT object_id, [name], auto_drop
FROM sys.stats;