Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Оптимизатор запросов использует статистику о столбцах для создания планов запросов, которые повышают производительность запросов. Статистические данные собираются из таблиц в базе данных и хранятся в метаданных базы данных.
Статистика создается автоматически, но также может быть создана вручную. Например, статистика создается автоматически для ключевых столбцов индекса при создании индекса. Дополнительные сведения о создании статистики см. в разделе "Статистика".
Данные таблицы обычно изменяются с течением времени при вставке, обновлении и удалении строк. Это означает, что статистика должна периодически обновляться. По умолчанию статистика для таблиц, находящихся на дисках, обновляется автоматически, когда оптимизатор определяет, что она может быть устаревшей.
Статистика по оптимизированным для памяти таблицам не обновляется по умолчанию. Вместо этого необходимо вручную обновить их. Используйте UPDATE STATISTICS (Transact-SQL) для отдельных столбцов, индексов или таблиц. Используйте sp_updatestats (Transact-SQL) для обновления статистики для всех пользовательских и внутренних таблиц в базе данных.
При использовании CREATE STATISTICS (Transact-SQL) или UPDATE STATISTICS (Transact-SQL)необходимо указать NORECOMPUTE
, чтобы отключить автоматическое обновление статистики для оптимизированных для памяти таблиц. Для таблиц на основе дисков sp_updatestats (Transact-SQL) обновляет статистику, только если таблица была изменена с момента последнего sp_updatestats (Transact-SQL). Для таблиц, оптимизированных для памяти, sp_updatestats (Transact-SQL) всегда генерирует обновленную статистику.
sp_updatestats (Transact-SQL) — это хороший вариант для оптимизированных для памяти таблиц; в противном случае необходимо знать, какие таблицы имеют значительные изменения, чтобы можно было отдельно обновить статистику.
Статистику можно создать с помощью выборки данных или выполнения полной проверки. Выборочная статистика использует только часть данных таблицы для оценки распределения данных. Полное сканирование статистики охватывает всю таблицу для определения распределения данных. Статистика полного сканирования обычно более точна, но требует больше времени на вычисление. Выборочные статистические данные можно собирать быстрее.
Таблицы на основе дисков используют выборку статистики по умолчанию. Оптимизированные для памяти таблицы поддерживают только статистику fullscan. При использовании CREATE STATISTICS (Transact-SQL) или UPDATE STATISTICS (Transact-SQL)необходимо указать FULLSCAN
параметр для оптимизированных для памяти таблиц.
Дополнительные рекомендации по статистике в таблицах, оптимизированных для памяти:
Индексы для оптимизированных для памяти таблиц создаются с помощью таблицы. Статистика по ключевым столбцам индекса создается, когда таблица пуста. Поэтому эти статистические данные необходимо обновить после загрузки данных в таблицу.
Для скомпилированных хранимых процедур планы выполнения запросов в процедуре оптимизированы при компиляции процедуры. Это происходит только при создании процедуры и при перезапуске сервера, а не при обновлении статистики. Поэтому таблицы должны содержать репрезентативный набор данных и статистики, которые необходимо up-to-date до создания процедур. (Скомпилированные хранимые процедуры в собственном коде перекомпилируются, если база данных выполняется в автономном режиме и возвращается в режим "в сети", или при перезапуске сервера.)
Рекомендации по статистике при развертывании таблиц Memory-Optimized
Чтобы оптимизатор запросов получил up-toстатистику даты при создании планов запросов, разверните оптимизированные для памяти таблицы, выполнив следующие пять шагов:
Создание таблиц и индексов. Индексы указаны непосредственно в операторах
CREATE TABLE
.Загрузите данные в таблицы.
Обновите статистику в таблицах.
Создайте хранимые процедуры, которые обращаются к таблицам.
Запустите рабочую нагрузку, которая может содержать сочетание скомпилированных и интерпретированных Transact-SQL хранимых процедур, а также нерегламентированных пакетов.
Создание скомпилированных в собственном коде хранимых процедур после загрузки данных и обновления статистики гарантирует, что оптимизатор имеет статистику, доступную для оптимизированных для памяти таблиц. Это обеспечит эффективное построение планов запросов, когда процедура компилируется.
Рекомендации по поддержанию статистики по таблицам Memory-Optimized
Чтобы сохранить статистику up-to-date, регулярно обновляйте статистику в таблицах, оптимизированных для памяти.
Если данные часто изменяются, следует часто обновлять статистику. Например, обновите статистику таблицы после пакетного обновления. После обновления статистики удалите и повторно создайте нативно скомпилированные хранимые процедуры, чтобы они могли воспользоваться обновленной статистикой.
.
Не обновляйте статистику во время пиковой нагрузки.
Чтобы обновить статистику, выполните следующее:
Используйте SQL Server Management Studio, чтобы создать план обслуживания с задачей обновления статистики
Или обновите статистику с помощью скрипта Transact-SQL, как описано ниже.
Чтобы обновить статистику для одной оптимизированной для памяти таблицы (myschema.Mytable), выполните следующий скрипт:
UPDATE STATISTICS myschema.Mytable WITH FULLSCAN, NORECOMPUTE
Чтобы обновить статистику для всех оптимизированных для памяти таблиц в текущей базе данных, выполните следующий сценарий:
DECLARE @sql NVARCHAR(MAX) = N''
SELECT @sql += N'
UPDATE STATISTICS ' + quotename(schema_name(schema_id)) + N'.' + quotename(name) + N' WITH FULLSCAN, NORECOMPUTE'
FROM sys.tables WHERE is_memory_optimized=1
EXEC sp_executesql @sql
Чтобы обновить статистику для всех таблиц в базе данных, выполните sp_updatestats (Transact-SQL).
В следующем примере сообщается, когда была обновлена статистика по таблицам, оптимизированным для памяти. Эти сведения помогут вам решить, нужно ли обновить статистику.
select t.object_id, t.name, sp.last_updated as 'stats_last_updated'
from sys.tables t join sys.stats s on t.object_id=s.object_id cross apply sys.dm_db_stats_properties(t.object_id, s.stats_id) sp
where t.is_memory_optimized=1