CREATE STATISTICS (Transact-SQL)

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

Отфильтрованная статистика может повысить производительность запросов, которые выполняют выборку из четко определенных подмножеств данных. Отфильтрованная статистика использует предикат фильтра в предложении WHERE для выбора подмножества данных, включенных в статистику.

Дополнительные сведения о статистике, а также условия использования инструкции CREATE STATISTICS, см. в разделе Использование статистики для повышения производительности запросов.

Значок ссылки на разделСоглашение о синтаксисе в Transact-SQL

Синтаксис

CREATE STATISTICS statistics_name 
ON { table_or_indexed_view_name } ( column [ ,...n ] ) 
    [ WHERE <filter_predicate> ]
    [ WITH 
        [ [ FULLSCAN 
          | SAMPLE number { PERCENT | ROWS } 
          | STATS_STREAM = stats_stream ] [ , ] ] 
        [ NORECOMPUTE ] 
    ] ;

<filter_predicate> ::= 
    <conjunct> [AND <conjunct>]

<conjunct> ::=
    <disjunct> | <comparison>

<disjunct> ::=
        column_name IN (constant ,…)

<comparison> ::=
        column_name <comparison_op> constant

<comparison_op> ::=
    IS | IS NOT | = | <> | != | > | >= | !> | < | <= | !<

Аргументы

  • statistics_name
    Имя создаваемой статистики.

  • table_or_indexed_view_name
    Имя таблицы или индексированного представления, для которого требуется создать статистику. Статистику можно создавать на основе таблиц или индексированных представлений другой базы данных; для этого нужно указать полное имя таблицы.

  • column [ ,…n]
    Задает ключевой столбец или список ключевых столбцов, на основе которых создается статистика. Можно указать любой столбец, который может указываться в качестве ключевого столбца индекса, за исключением следующих столбцов.

    • Нельзя указывать столбцы Xml, полнотекстовые столбцы и столбцы FILESTREAM.

    • Вычисляемые столбцы могут быть указаны только в том случае, если параметры ARITHABORT и QUOTED_IDENTIFIER базы данных имеют значение ON.

    • Столбцы, имеющие определяемый пользователем тип данных CLR, могут быть указаны, если этот тип поддерживает двоичное упорядочивание. Вычисляемые столбцы, определенные как вызовы методов для столбца пользовательского типа, могут быть указаны, если эти методы отмечены как детерминированные. Дополнительные сведения о создании столбцов, имеющих определяемый пользователем тип данных CLR, см. в разделе Работа с определяемыми пользователем типами данных CLR.

    Максимальный общий размер значений составного столбца равен 900 байт.

  • WHERE <filter_predicate>
    Указывает выражение для выбора подмножества включаемых строк при создании объекта статистики. Статистика, создаваемая с предикатом фильтра, называется отфильтрованной. Предикат фильтра использует простую логику сравнения и не может ссылаться на вычисляемый столбец, столбец определяемого пользователем типа, столбец пространственного типа данных или столбец типа 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
    Вычисляет статистику путем просмотра всех строк в таблице или индексированном представлении. FULLSCAN и SAMPLE 100 PERCENT имеют одинаковые результаты. FULLSCAN не может быть использован с параметром SAMPLE.

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

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

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

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

  • NORECOMPUTE
    Отключает параметр автоматического обновления статистики AUTO_STATISTICS_UPDATE для объекта statistics_name. Если указан этот параметр, то оптимизатор запросов завершит все текущие операции обновления статистики для объекта statistics_name и отключит обновление в будущем.

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

    ПредупреждениеВнимание!

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

    Дополнительные сведения о параметре AUTO_STATISTICS_UPDATE см. в разделе Параметры ALTER DATABASE SET (Transact-SQL). Дополнительные сведения об отключении и повторном включении обновления статистики см. в разделе Использование статистики для повышения производительности запросов.

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

Замечания

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

Категория для статистики

Максимум

Столбцы по объекту статистики

32

Статистика, созданная по индексам

1 на индекс и 1000 на таблицу

Статистика, созданная по столбцам

30000 на таблицу

Условия использования инструкции CREATE STATISTICS

Дополнительные сведения об условиях использования CREATE STATISTICS см. в разделе Использование статистики для повышения производительности запросов.

Упоминаемые зависимости для отфильтрованной статистики

Представление каталога sys.sql_expression_dependencies представляет каждый столбец в предикате отфильтрованной статистики как ссылаемую зависимость. Обратите внимание на операции, которые выполняются на столбцах таблицы, созданной до создания отфильтрованной статистики, потому что определение столбца таблицы, указанного в предикате отфильтрованной статистики, невозможно удалить, переименовать или изменить.

Разрешения

Для создания статистики пользователь должен быть владельцем таблицы или индексированного представления или членом одной из следующих ролей: фиксированная роль сервера sysadmin, предопределенная роль базы данных db_owner или предопределенная роль базы данных db_ddladmin.

Примеры

A. Использование инструкции CREATE STATISTICS с аргументом «SAMPLE число PERCENT»

В следующем примере создается статистика ContactMail1, использующая случайную 5-процентную выборку из столбцов ContactID и EmailAddress таблицы Contact из базы данных AdventureWorks.

USE AdventureWorks;
GO
CREATE STATISTICS ContactMail1
    ON Person.Contact (ContactID, EmailAddress)
    WITH SAMPLE 5 PERCENT;

Б. Использование инструкции CREATE STATISTICS с аргументами FULLSCAN и NORECOMPUTE

В следующем примере создается статистика ContactMail2 по всем строкам для столбцов ContactID и EmailAddress таблицы Contact, при этом автоматический перерасчет статистики блокируется.

CREATE STATISTICS NamePurchase
    ON AdventureWorks.Person.Contact (ContactID, EmailAddress)
    WITH FULLSCAN, NORECOMPUTE;

В. Создание отфильтрованной статистики с помощью инструкции CREATE STATISTICS

В следующем примере создается статистика фильтрации ContactPromotion1. Компонент Database Engine просматривает 50 процентов данных, а затем выбирает все строки с EmailPromotion, равным 2.

USE AdventureWorks;
GO
IF EXISTS (SELECT name FROM sys.stats
    WHERE name = N'ContactPromotion1'
    AND object_id = OBJECT_ID(N'Person.Contact'))
DROP STATISTICS Person.Contact.ContactPromotion1
GO
CREATE STATISTICS ContactPromotion1
    ON Person.Contact (ContactID, EmailAddress, EmailPromotion)
WHERE EmailPromotion = 2
WITH SAMPLE 50 PERCENT;
GO

Журнал изменений

Обновленное содержимое

Правки документа для уточнения сведений.

Раздел ссылается на новые сведения о статистике в разделе Использование статистики для повышения производительности запросов.