Обучение
Схема обучения
Use advance techniques in canvas apps to perform custom updates and optimization - Training
Use advance techniques in canvas apps to perform custom updates and optimization
Этот браузер больше не поддерживается.
Выполните обновление до Microsoft Edge, чтобы воспользоваться новейшими функциями, обновлениями для системы безопасности и технической поддержкой.
Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Применимо:SQL Server
База данных SQL Azure
Управляемый экземпляр SQL Azure
Система аналитической платформы (PDW)
SQL база данных в Microsoft Fabric
Эта статья поможет вам понять, когда и как лучше всего выполнять обслуживание индексов. Здесь рассматриваются такие понятия, как фрагментация индексов и плотность страниц, а также их влияние на производительность запросов и потребление ресурсов. Также описываются методы обслуживания индексов, в частности реорганизация индекса и перестроение индекса, и предлагается стратегия обслуживания индексов с оптимальным балансом между повышением производительности и снижением уровня потребления ресурсов, необходимых для обслуживания.
Примечание
Эта статья не применяется к выделенному пулу SQL в Azure Synapse Analytics. Сведения о обслуживании индексов для выделенного пула SQL в Azure Synapse Analytics см. в статье Индексирование выделенных таблиц пула SQL в Azure Synapse Analytics.
Что такое фрагментация индекса и как она влияет на производительность?
В индексах B-дерева (rowstore) фрагментацией называют такое состояние, когда для некоторых страниц индекса логический порядок, основанный на значении ключа, не совпадает с физическим порядком страниц индекса.
Примечание
В документации термин B-tree обычно используется в ссылке на индексы. В индексах rowstore ядро СУБД реализует дерево B+. Это не относится к индексам columnstore или индексам в таблицах, оптимизированных для памяти. Дополнительные сведения см. в руководстве по архитектуре и проектированию индексов SQL Sql Server и Azure.
Ядро СУБД автоматически изменяет индексы при каждом выполнении операций вставки, обновления или удаления в базовые данные. Например, добавление строк в таблицу может привести к разделению существующих страниц в индексах строк, освобождая место для вставки новых строк. Со временем такие изменения накапливаются и могут привести к тому, что данные в индексе будут неупорядоченно "разбросаны" по базе данных (то есть фрагментированы).
Для запросов, которые считывают большое количество страниц с использованием полного или диапазонного сканирования индекса, сильно фрагментированные индексы могут снизить производительность запросов, если для чтения данных требуются дополнительные операции ввода-вывода. Чтобы получить ту же самую информацию, вместо малого числа запросов на ввод-вывод большого объема данных придется выполнять большое количество запросов на ввод-вывод малого объема данных.
Если подсистема хранения имеет более высокую производительность последовательных операций ввода-вывода по сравнению с произвольными операциями ввода-вывода, то фрагментация индекса может привести к снижению производительности, ведь для чтения фрагментированных индексов требуется больше случайных операций ввода-вывода.
Что такое плотность страниц (или заполненность страниц) и как она влияет на производительность?
Совет
Для многих рабочих нагрузок повышение плотности страниц позволяет больше повысить производительность, чем снижение фрагментации.
Чтобы не допустить излишнего снижения плотности страниц, корпорация Майкрософт не рекомендует задавать коэффициент заполнения, отличный от значения 100 (или 0), за исключением тех сценариев, в которых индексы часто подвергаются разбиению страниц, как, например, часто изменяемые индексы с ведущими столбцами, которые содержат непоследовательные значения GUID.
Как фрагментацию, так и плотность страниц важно учитывать при принятии решений о времени обслуживания индекса и предпочтительном методе обслуживания.
Фрагментация для индексов rowstore и columnstore определяется по-разному. Для индексов rowstore функция sys.dm_db_index_physical_stats позволяет узнать фрагментацию и плотность страниц для конкретного индекса, для всех индексов в таблице или индексированном представлении, для всех индексов в базе данных или для всех индексов во всех базах данных. Для секционированных индексов sys.dm_db_index_physical_stats()
возвращает информацию отдельно для каждой секции.
Набор результатов, возвращаемый sys.dm_db_index_physical_stats
, включает в себя следующие столбцы:
Столбец | Описание |
---|---|
avg_fragmentation_in_percent |
Логическая фрагментация (неупорядоченные страницы в индексе). |
avg_page_space_used_in_percent |
Средняя плотность страниц. |
Для сжатых групп строк в индексах columnstore фрагментация определяется как отношение числа удаленных строк к общему числу строк, выраженное в процентах. Функция sys.dm_db_column_store_row_group_physical_stats позволяет определить общее число строк и число удаленных строк отдельно для каждой группы строк в определенном индексе, во всех индексах таблицы или во всех индексах базы данных.
Набор результатов, возвращаемый sys.dm_db_column_store_row_group_physical_stats
, включает следующие столбцы:
Столбец | Описание |
---|---|
total_rows |
Количество строк, которые физически хранятся в группе строк. Для сжатых групп строк учитываются строки, помеченные как удаленные. |
deleted_rows |
Количество строк, физически хранящихся в сжатой группе строк и помеченных для удаления. Для групп строк в разностном хранилище это значение равно 0. |
Фрагментация сжатых групп строк в индексе columnstore можно вычислить с помощью следующей формулы:
100.0*(ISNULL(deleted_rows,0))/NULLIF(total_rows,0)
Совет
Для индексов rowstore и columnstore проверьте фрагментацию индекса или кучи и плотность страниц после того, как было удалено или обновлено большое количество строк. Для кучи, если существуют частые обновления, периодически просматривайте фрагментацию, чтобы избежать распространения записей пересылки. Дополнительные сведения о кучах см. в разделе Кучи (таблицы без кластеризованных индексов).
Ознакомьтесь с примерами запросов для определения фрагментации и плотности страниц.
Вы можете уменьшить фрагментацию индекса и увеличить плотность страниц с помощью любого из следующих методов:
Примечание
Для секционированных индексов оба эти метода можно применять ко всем секциям или к одной секции индекса.
Реорганизация индекса требует меньше ресурсов, чем его перестроение. Поэтому следует считать ее предпочтительным методом для обслуживания индекса, если нет веских причин использовать перестроение индекса. Реорганизация всегда выполняется онлайн. Это означает, что не создаются долгосрочные блокировки таблиц и запросы или обновления базовой таблицы во время выполнения операции ALTER INDEX ... REORGANIZE
могут продолжаться.
Примечание
Начиная с SQL Server 2019 (15.x), SQL базы данных Azure и Управляемого экземпляра SQL Azure, перемещение кортежей поддерживается задачей фонового слияния, которая автоматически сжимает небольшие открытые дельта группы строк, существовавшие в течение некоторого времени, как это определено внутренним пороговым значением, либо объединяет сжатые группы строк, из которых было удалено большое количество строк. Это со временем повышает качество индекса columnstore. В большинстве случаев это избавляет от необходимости выдавать команды ALTER INDEX ... REORGANIZE
.
Совет
Если операция реорганизации отменяется пользователем или прерывается иным образом, все уже достигнутые улучшения сохраняются в базе данных. Для реорганизации больших индексов можно многократно запускать и останавливать операцию, пока не будет завершена вся работа.
При перестроении старый индекс удаляется, и создается новый. В зависимости от типа индекса и версии ядра СУБД операция перестроения может выполняться в подключенном или автономном режиме. Перестроение индекса в автономном режиме обычно занимает меньше времени, чем перестроение с подключением, но при этом используются блокировки на уровне объектов на весь период операции перестроения, что блокирует выполнение запросов к таблице или представлению.
Перестроение индекса онлайн не требует блокировок на уровне объектов до окончания операции, когда необходимо удерживать блокировку на короткий период для завершения перестроения. В зависимости от версии ядра СУБД, онлайн перестроение индекса может запускаться как возобновляемая операция. Возобновляемое перестроение индекса можно приостановить, сохраняя ход выполнения до текущего момента. Операцию возобновляемого перестроения можно возобновить после приостановки или другого прерывания. Кроме того, ее можно отменить, если завершение перестроения больше не требуется.
Синтаксис Transact-SQL см. в разделе ALTER INDEX REBUILD. Дополнительные сведения об операциях с индексами в режиме онлайн см. в статье Выполнение операций с индексами на линии.
Примечание
Пока индекс перестраивается в режиме онлайн, каждое изменение данных в индексируемых столбцах должно обновлять дополнительную копию индекса. Это может привести к незначительному снижению производительности инструкций изменения данных во время онлайн-перестроения.
Если приостановлена операция возобновляемого индекса, это влияние на производительность сохраняется до тех пор, пока операция не будет завершена или отменена. Если вы не планируете завершать возобновляемую операцию с индексами, лучше сразу отменить ее, а не приостанавливать
Совет
В зависимости от доступных ресурсов и шаблонов рабочей нагрузки, указывая значение, более высокое, чем значение по умолчанию MAXDOP
, в инструкции ALTER INDEX REBUILD, можно сократить продолжительность перестроения за счёт более высокого использования ЦП.
Для индексов rowstore перестроение позволяет устранить фрагментацию на всех уровнях индекса и сжать страницы до указанного (или настроенного) коэффициента заполнения. Если указано значение ALL
, то все индексы в таблице удаляются и перестраиваются в ходе одной операции. При перестроении индексов с 128 или более экстентами ядро СУБД откладывает размещение страниц и получение связанных блокировок до завершения перестроения. Примеры синтаксиса см. в разделе Примеры: перестроение индексов rowstore.
Для индексов columnstore перестроение позволяет устранить фрагментацию, переместить все строки разностного хранилища в columnstore и физически удалить строки, помеченные для удаления. Примеры синтаксиса см. в разделе Примеры: перестроение индексов columnstore.
Совет
Начиная с SQL Server 2016 (13.x), перестроение индекса columnstore обычно не требуется, так как REORGANIZE
выполняет основные компоненты перестроения в режиме онлайн.
До SQL Server 2008 (10.0.x) иногда можно перестроить некластеризованный индекс rowstore, чтобы исправить несоответствия из-за повреждения данных в индексе.
Вы по-прежнему можете исправить такие несоответствия в некластеризованном индексе, перестроив некластеризованный индекс в автономном режиме. Но вы не сможете устранить несоответствия в некластеризованном индексе, перестроив индекс в режиме онлайн, потому что этот механизм перестроения использует существующий некластеризованный индекс в качестве основы для перестроения, и поэтому несоответствия сохранятся. Перестроение индекса в автономном режиме иногда может вызвать принудительную проверку кластеризованного индекса (или кучи), при которой данные с несоответствиями в некластеризованном индексе будут заменены правильными данными из кластеризованного индекса или кучи.
Чтобы в качестве источника данных применялся именно кластеризованный индекс или куча, вместо перестроения некластеризованного индекса удалите его и создайте заново. Как и в предыдущих версиях, вы можете восстановиться после несоответствий, восстанавливая затронутые данные из резервной копии. Однако вы можете восстановить некластеризованные несоответствия индекса, перестроив его в автономном режиме или повторно создав его. Дополнительные сведения см. в разделе DBCC CHECKDB (Transact-SQL).
Используйте такие решения, как адаптивный дефрагмент индекса, чтобы автоматически управлять фрагментацией индекса и обновлениями статистики для одной или нескольких баз данных. С помощью линейного порогового значения эта процедура автоматически принимает решение о перестройке или реорганизации индекса в зависимости от его уровня фрагментации и других параметров, а также об обновлении статистики.
Автоматическое перестроение всех некластеризованных индексов rowstore в таблице происходит в следующих случаях:
CREATE CLUSTERED INDEX ... WITH (DROP_EXISTING = ON)
.В следующих сценариях все некластеризованные индексы rowstore в одной и той же таблице не перестраиваются автоматически:
Важно!
Индекс нельзя реорганизовать или перестроить, если файловая группа, в которой он находится, не подключена к сети или доступна только для чтения. Если указано ключевое слово ALL, а один или несколько индексов размещены в файловой группе, которая находится в автономном режиме или доступна только для чтения, эта инструкция завершается ошибкой.
При перестроении индекса на физическом носителе должно быть достаточно места для хранения двух копий индекса. После завершения перестроения ядро СУБД удаляет исходный индекс.
При указании ALL
в инструкции ALTER INDEX ... REORGANIZE
выполняется реорганизация кластеризованных, некластеризованных и XML-индексов таблицы.
Восстановление или реорганизация небольших индексов "rowstore" обычно не уменьшают фрагментацию. Вплоть до SQL Server 2014 (12.x), sql Server ядро СУБД выделяет пространство с помощью смешанных экстентов. Поэтому страницы небольших индексов иногда хранятся в нескольких экстентах, что неявным образом делает такие индексы фрагментированными. Смешанные экстенты могут находиться в общем пользовании у восьми объектов, поэтому фрагментацию в малом индексе нельзя уменьшить путем его реорганизации или перестроения.
При перестроении индекса колоночного хранилища ядро СУБД считывает все данные из исходного индекса колоночного хранилища, включая набор данных дельта. Данные объединяются в новые группы строк, а группы строк сжимаются в columnstore. Ядро СУБД дефрагментирует columnstore путем физического удаления строк, помеченных как удаленные.
Примечание
Начиная с SQL Server 2019 (15.x), перемещение кортежей поддерживается задачей фонового слияния, которая автоматически сжимает небольшие открытые группы строк разностного хранилища, существующие в течение некоторого времени, определённого внутренним порогом, или объединяет сжатые группы строк, из которых было удалено большое количество строк. Со временем это повышает качество индекса columnstore. Для получения дополнительной информации о терминах и концепциях columnstore см. статью "Обзор индексов columnstore".
Если индекс велик, то перестроение всей таблицы занимает много времени и на диске должно хватать места для сохранения полной копии индекса на время перестроения.
Для секционированных таблиц не требуется перестраивать весь индекс columnstore, если фрагментация есть только в некоторых секциях, например в тех секциях, где операции UPDATE
, DELETE
или MERGE
затронули большое количество строк.
Перестроение раздела после загрузки или изменения данных гарантирует, что все данные хранятся в сжатых группах строк в columnstore. Когда в процессе загрузки данные вставляются в секцию пакетами, размер которых не превышает 102 400 строк, такая секция может иметь в разностном хранилище несколько открытых групп строк. Перестроение позволяет переместить все строки разностного хранилища в сжатые группы строк в columnstore.
При реорганизации индекса columnstore ядро СУБД сжимает каждую закрытую группу строк в разностном хранилище в columnstore в виде сжатой группы строк. Начиная с SQL Server 2016 (13.x) и в базе данных SQL Azure команда REORGANIZE
выполняет следующие дополнительные оптимизации дефрагментации онлайн:
После выполнения загрузок данных в разностном хранилище может находиться несколько небольших групп строк. Вы можете применить ALTER INDEX REORGANIZE
, чтобы принудительно передать эти группы строк в columnstore, а затем объединить малые сжатые группы строк в большие сжатые группы строк. Операция реорганизации также приведет к удалению строк, которые были помечены как удаленные в columnstore.
Примечание
Реорганизация индекса columnstore с помощью Management Studio объединяет сжатые группы строк, но не обеспечивает, чтобы все группы строк были сжаты в columnstore. В columnstore будут сжаты только закрытые группы строк, но не открытые.
Чтобы принудительно сжать все группы строк, используйте пример Transact-SQLCOMPRESS_ALL_ROW_GROUPS = ON
Обслуживание индекса, для которого применяется метод реорганизации или перестроения, требует много ресурсов. Это приводит к значительному увеличению нагрузки на ЦП, используемой памяти и операций ввода-вывода в хранилище. При этом в зависимости от рабочей нагрузки базы данных и других факторов выгоды, которые она предоставляет, могут колебаться от жизненно важных до несущественных.
Чтобы избежать ненужного использования ресурсов, избегайте неизбирательного обслуживания индекса. Следует опытным путем оценить повышение производительности от обслуживания индексов для каждой рабочей нагрузки, используя рекомендуемую стратегию, и сопоставить его с затратами ресурсов и влиянием на рабочую нагрузку, которые потребуются для достижения этих преимуществ.
Вероятность заметного повышения производительности от реорганизации или перестроения индекса будет выше, если этот индекс сильно фрагментирован или имеет низкую плотность страниц. Но это не единственные факторы, которые нужно учитывать. Важную роль могут играть шаблоны запросов (обработка транзакций или аналитика и отчетность), поведение подсистемы хранения, доступный объем памяти и постепенное развитие ядра СУБД.
Важно!
Решения по обслуживанию индекса следует принимать после оценки нескольких факторов в контексте каждой конкретной рабочей нагрузки, в том числе затрат ресурсов на обслуживание. Нельзя ограничивать критерии выбора фиксированными целевыми значениями фрагментации или плотности страниц.
Клиенты часто наблюдают улучшения производительности после перестроения индексов. Но во многих случаях эти улучшения не связаны со снижением фрагментации или увеличением плотности страниц.
Перестроение индекса дает еще одно важное преимущество: позволяет обновить статистику по ключевым столбцам индекса, сканируя все строки в индексе. Это эквивалентно операции UPDATE STATISTICS ... WITH FULLSCAN
, которая позволяет актуализировать статистику и иногда дает более точные данные, чем обычное обновление статистики по ограниченной выборке. При обновлении статистики заново компилируются все планы запросов, которые ее используют. Если прежний план запроса не был оптимальным из-за устаревшей статистики, недостаточного объема выборки для статистики или по любой другой причине, то после повторной компиляции многие планы дают лучшие результаты.
Клиенты часто неправильно полагают, что это улучшение связано с перестроением индекса, которое снизило фрагментацию и увеличило плотность страниц. Но на практике такие же преимущества часто достигаются и менее требовательной к ресурсам операцией обновления статистики вместо перестроения индексов.
Совет
Затраты ресурсов на обновление статистики незначительны по сравнению с перестройкой индексов, и операция часто завершается за считанные минуты. Перестроение индекса может занять несколько часов.
Корпорация Майкрософт рекомендует всем клиентам изучить и применить следующую стратегию обслуживания индексов:
WITH SAMPLE ... PERCENT
или WITH FULLSCAN
(это нечасто встречается).Помимо описанных выше рекомендаций и стратегий, в SQL базе данных Azure и управляемом экземпляре SQL Azure особенно важно учитывать затраты и преимущества обслуживания индексов. Клиентам следует выполнять его только в том случае, если такая потребность подтверждается фактами, и обязательно с учетом указанных ниже факторов.
Существуют конкретные, но редкие сценарии, когда может потребоваться однократное или периодическое обслуживание индекса в Azure SQL Database и Azure SQL Managed Instance.
Совет
Если вы определили, что обслуживание индексов необходимо для ваших рабочих нагрузок в базах данных SQL Azure и управляемых экземплярах SQL Azure, следует либо реорганизовать индексы, либо использовать онлайн-перестроение индексов. Это позволит нагрузкам запросов использовать таблицы во время перестроения индексов.
Кроме того, возможность возобновления операции позволяет избежать её перезапуска с самого начала, если работа будет прервана как плановым, так и внеплановым переключением базы данных. Использование возобновляемых операций с индексами особенно важно, если индексы большие.
Совет
Операции с индексами в офлайн-режиме обычно выполняются быстрее, чем онлайн-операции. Их следует использовать, когда в период выполнения операции не нужно будет выполнять запросы к таблицам, например, после загрузки данных в промежуточные таблицы в рамках последовательного процесса извлечения, преобразования и загрузки данных.
Перестроение индексов rowstore с более чем 128 экстентами осуществляется в два этапа: логическое и физическое. На этапе логического перестроения существующие единицы распределения, используемые индексом, помечаются для освобождения, строки данных копируются и сортируются, а затем перемещаются в новые единицы распределения, созданные для хранения перестроенного индекса. На физической фазе единицы распределения, ранее помеченные для деаллокации, физически удаляются посредством коротких транзакций, выполняемых в фоновом режиме, и не требуют многочисленных блокировок. Дополнительные сведения об единицах размещения смотрите в статье Руководство по архитектуре страниц и экстентов.
Инструкция ALTER INDEX REORGANIZE
требует, чтобы в файле данных, где содержится индекс, было свободное пространство, потому что операция может выделять временные рабочие страницы только в том же файле (а не в другом файле файловой группы, к примеру). Несмотря на то, что у файловой группы есть свободное место, пользователь по-прежнему может столкнуться с ошибкой 1105: Could not allocate space for object '###' in database '###' because the '###' filegroup is full. Create disk space by deleting unneeded files, dropping objects in the filegroup, adding additional files to the filegroup, or setting autogrowth on for existing files in the filegroup
во время реорганизации операции, если файл данных недоступен.
Индекс нельзя реорганизовать, если для ALLOW_PAGE_LOCKS
задано состояние OFF.
До SQL Server 2017 (14.x), перестроение кластеризованного индекса columnstore — это автономная операция. При перестроении механизм базы данных должен получить исключительную блокировку таблицы или раздела. Данные находятся в автономном режиме и недоступны во время перестроения, даже при использовании NOLOCK
, изоляции моментальных снимков с подтвержденным чтением (RCSI) или изоляции моментальных снимков. Начиная с SQL Server 2019 (15.x), кластеризованный индекс columnstore можно перестроить с помощью ONLINE = ON
параметра.
Предупреждение
Создание и перестройка невыровненных индексов для таблицы, количество секций в которой превышает 1000, возможны, но не поддерживаются. Это может привести к снижению производительности или чрезмерному потреблению памяти во время этих операций. Если количество секций превышает 1000, рекомендуется использовать только выровненные индексы.
FULLSCAN
в CREATE STATISTICS
или UPDATE STATISTICS
. Однако начиная с SQL Server 2012 (11.x) при создании или перестроении секционированного индекса статистика не создается или обновляется путем сканирования всех строк в таблице. Вместо этого используется коэффициент выборки по умолчанию. Чтобы создать или обновить статистику секционированных индексов путем сканирования всех строк таблицы, используйте инструкции CREATE STATISTICS или UPDATE STATISTICS с предложением FULLSCAN
.PERSIST_SAMPLE_PERCENT
для предложения ON
, возобновляемые операции с индексами будут использовать для создания или обновления статистики сохраненный коэффициент выборки.В приведенном ниже примере определяется средняя фрагментация и плотность страниц для всех индексов rowstore в текущей базе данных. Здесь используется режим SAMPLED
для быстрого получения применимых на практике результатов. Для получения более точных результатов используйте режим DETAILED
. Для этого требуется сканирование всех страниц индекса и может занять много времени.
SELECT OBJECT_SCHEMA_NAME(ips.object_id) AS schema_name,
OBJECT_NAME(ips.object_id) AS object_name,
i.name AS index_name,
i.type_desc AS index_type,
ips.avg_fragmentation_in_percent,
ips.avg_page_space_used_in_percent,
ips.page_count,
ips.alloc_unit_type_desc
FROM sys.dm_db_index_physical_stats(DB_ID(), default, default, default, 'SAMPLED') AS ips
INNER JOIN sys.indexes AS i
ON ips.object_id = i.object_id
AND
ips.index_id = i.index_id
ORDER BY page_count DESC;
Предыдущая инструкция возвращает результирующий набор, как показано ниже.
schema_name object_name index_name index_type avg_fragmentation_in_percent avg_page_space_used_in_percent page_count alloc_unit_type_desc
------------ --------------------- ---------------------------------------- ------------- ---------------------------- ------------------------------ ----------- --------------------
dbo FactProductInventory PK_FactProductInventory CLUSTERED 0.390015600624025 99.7244625648629 3846 IN_ROW_DATA
dbo DimProduct PK_DimProduct_ProductKey CLUSTERED 0 89.6839757845318 497 LOB_DATA
dbo DimProduct PK_DimProduct_ProductKey CLUSTERED 0 80.7132814430442 251 IN_ROW_DATA
dbo FactFinance NULL HEAP 0 99.7982456140351 239 IN_ROW_DATA
dbo ProspectiveBuyer PK_ProspectiveBuyer_ProspectiveBuyerKey CLUSTERED 0 98.1086236718557 79 IN_ROW_DATA
dbo DimCustomer IX_DimCustomer_CustomerAlternateKey NONCLUSTERED 0 99.5197553743514 78 IN_ROW_DATA
Более подробную информацию см. в sys.dm_db_index_physical_stats.
В приведенном ниже примере определяется средняя фрагментация для всех индексов columnstore со сжатыми группами строк в текущей базе данных.
SELECT OBJECT_SCHEMA_NAME(i.object_id) AS schema_name,
OBJECT_NAME(i.object_id) AS object_name,
i.name AS index_name,
i.type_desc AS index_type,
100.0 * (ISNULL(SUM(rgs.deleted_rows), 0)) / NULLIF(SUM(rgs.total_rows), 0) AS avg_fragmentation_in_percent
FROM sys.indexes AS i
INNER JOIN sys.dm_db_column_store_row_group_physical_stats AS rgs
ON i.object_id = rgs.object_id
AND
i.index_id = rgs.index_id
WHERE rgs.state_desc = 'COMPRESSED'
GROUP BY i.object_id, i.index_id, i.name, i.type_desc
ORDER BY schema_name, object_name, index_name, index_type;
Предыдущий запрос возвращает результирующий набор, аналогичный следующему:
schema_name object_name index_name index_type avg_fragmentation_in_percent
------------ ---------------------- ------------------------------------ ------------------------- ----------------------------
Sales InvoiceLines NCCX_Sales_InvoiceLines NONCLUSTERED COLUMNSTORE 0.000000000000000
Sales OrderLines NCCX_Sales_OrderLines NONCLUSTERED COLUMNSTORE 0.000000000000000
Warehouse StockItemTransactions CCX_Warehouse_StockItemTransactions CLUSTERED COLUMNSTORE 4.225346161484279
Примечание
Дополнительные примеры использования Transact-SQL для перестроения или реорганизации индексов см. в статье ALTER INDEX Examples — Rowstore Indexes и ALTER INDEX Examples — Columnstore Indexes.
В приведенном ниже примере показано, как реорганизовать индекс IX_Employee_OrganizationalLevel_OrganizationalNode
в таблице HumanResources.Employee
базы данных AdventureWorks2022
.
ALTER INDEX IX_Employee_OrganizationalLevel_OrganizationalNode
ON HumanResources.Employee
REORGANIZE;
В приведенном ниже примере показано, как реорганизовать индекс columnstore IndFactResellerSalesXL_CCI
в таблице dbo.FactResellerSalesXL_CCI
базы данных AdventureWorksDW2022
. Эта команда принудительно объединяет все закрытые и открытые группы строк в колонночное хранилище.
-- This command forces all closed and open row groups into columnstore.
ALTER INDEX IndFactResellerSalesXL_CCI
ON FactResellerSalesXL_CCI
REORGANIZE WITH (COMPRESS_ALL_ROW_GROUPS = ON);
В приведенном ниже примере показано, как реорганизовать все индексы в таблице HumanResources.Employee
базы данных AdventureWorks2022
.
ALTER INDEX ALL ON HumanResources.Employee
REORGANIZE;
В следующем примере показано, как перестроить единственный индекс на таблице Employee
базы данных AdventureWorks2022
.
ALTER INDEX PK_Employee_BusinessEntityID ON HumanResources.Employee
REBUILD
;
В приведенном ниже примере показано, как перестроить все индексы, связанные с таблицей базы данных AdventureWorks2022
, используя ключевое слово ALL
. Указываются три параметра.
ALTER INDEX ALL ON Production.Product
REBUILD WITH (FILLFACTOR = 80, SORT_IN_TEMPDB = ON,
STATISTICS_NORECOMPUTE = ON)
;
Подробные сведения см. в статье ALTER INDEX (Transact-SQL).
Обучение
Схема обучения
Use advance techniques in canvas apps to perform custom updates and optimization - Training
Use advance techniques in canvas apps to perform custom updates and optimization
События
Присоединение к вызову ИИ Навыков
8 апр., 15 - 28 мая, 07
Отточите свои навыки ИИ и введите подметки, чтобы выиграть бесплатный экзамен сертификации
Зарегистрируйтесь!