Как настроить Azure SQL для автоматического перестроения индексов?

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

Как настроить его в базе данных SQL Azure?

P.S. Я пробовал это раньше, но, поскольку я не мог найти никаких вариантов для этого, я подумал, что, возможно, они делают это автоматически, пока я не прочитал этот пост и попробовал:

SELECT
 DB_NAME() AS DBName
 ,OBJECT_NAME(ps.object_id) AS TableName
 ,i.name AS IndexName
 ,ips.index_type_desc
 ,ips.avg_fragmentation_in_percent
 FROM sys.dm_db_partition_stats ps
 INNER JOIN sys.indexes i
 ON ps.object_id = i.object_id
 AND ps.index_id = i.index_id
 CROSS APPLY sys.dm_db_index_physical_stats(DB_ID(), ps.object_id, ps.index_id, null, 'LIMITED') ips
 ORDER BY ps.object_id, ps.index_id

И обнаружил, что у меня есть индексы, которые нужно поддерживать введите здесь описание изображения


person Ashkan Sirous    schedule 08.02.2018    source источник


Ответы (6)


Обновление: обратите внимание, что команда инженеров опубликовала обновленное руководство, чтобы лучше систематизировать некоторые предложения в этом ответе в более официальном месте от Microsoft, поскольку об этом просили некоторые клиенты. Руководство по индексированию SQL Server/БД. Спасибо, Конор

оригинальный ответ:

Я укажу, что большинству людей вообще не нужно думать о перестроении индексов в SQL Azure. Да, индексы дерева B+ могут стать фрагментированными, и да, это может привести к некоторым накладным расходам пространства и некоторым накладным расходам ЦП по сравнению с идеально настроенными индексами. Итак, есть несколько сценариев, когда мы работаем с клиентами над перестроением индексов. (Основной сценарий — это когда у клиента может закончиться свободное место в настоящее время, так как дисковое пространство в SQL Azure несколько ограничено из-за текущей архитектуры). Итак, я призываю вас сделать шаг назад и подумать, что использование модели SQL Server для управления базами данных не является неправильным, но оно может стоить или не стоит ваших усилий.

(Если в конечном итоге вам потребуется перестроить индекс, вы можете использовать модели, размещенные здесь другими авторами, — они, как правило, являются прекрасными моделями для сценариев задач. Обратите внимание, что управляемый экземпляр SQL Azure также поддерживает агент SQL, который вы также можете использовать. для создания заданий для сценариев обслуживания операций, если вы того пожелаете).

Вот некоторые детали, которые могут помочь вам решить, можете ли вы быть кандидатом на перестроение индекса:

  • Ссылка, на которую вы ссылаетесь, взята из сообщения 2013 года. Архитектура SQL Azure была полностью переделана после этого сообщения. В частности, аппаратная архитектура перешла от модели, основанной на локальных вращающихся дисках, к модели, основанной на локальных твердотельных накопителях (в большинстве случаев). Таким образом, руководство в исходном сообщении устарело.
  • У вас могут быть случаи в текущей архитектуре, когда у вас может не хватить места с фрагментированным индексом. У вас есть варианты перестроить индекс или перейти на больший размер резервирования на некоторое время (что будет стоить больше денег), который поддерживает выделение большего дискового пространства. [Поскольку локальное пространство SSD на машинах ограничено, размеры резервирования примерно связаны с пропорциями машины. По мере того, как мы получаем более новое оборудование с большими/больше дисками, у вас появляется больше возможностей масштабирования].
  • Влияние фрагментации SSD относительно невелико по сравнению с вращающимися дисками, поскольку стоимость произвольного ввода-вывода на самом деле не выше, чем последовательного. Затраты процессора на прохождение еще нескольких промежуточных страниц дерева B+ скромны. Я обычно видел накладные расходы, возможно, 5-20% максимум в среднем случае (что может или не может оправдать регулярные перестроения, которые имеют гораздо большее влияние на рабочую нагрузку при перестроении)
  • Если вы используете хранилище запросов (которое включено по умолчанию в SQL Azure), вы можете оценить, заметно ли помогает перестроение определенного индекса вашей производительности. Вы можете сделать это в качестве теста, чтобы увидеть, улучшится ли ваша рабочая нагрузка, прежде чем тратить время на создание и управление операциями перестроения индекса самостоятельно.
  • Обратите внимание, что в настоящее время в SQL Azure нет управления ресурсами внутри базы данных для пользовательских рабочих нагрузок. Таким образом, если вы начнете перестроение индекса, вы можете в конечном итоге потреблять много ресурсов и влиять на свою основную рабочую нагрузку. Конечно, вы можете попытаться запланировать выполнение задач в нерабочее время, но для приложений с большим количеством клиентов по всему миру это может оказаться невозможным.
  • Кроме того, я отмечу, что многие клиенты имеют задания по перестройке индекса, потому что они хотят, чтобы статистика обновлялась. Нет необходимости перестраивать индекс только для перестроения статистики. В недавних версиях SQL Server и SQL Azure алгоритм обновления статистики стал более агрессивным для больших таблиц, а модель того, как мы оцениваем кардинальность в случаях, когда клиенты запрашивают недавно вставленные данные (с момента последнего обновления статистики), была изменена в более поздней совместимости. уровни. Таким образом, часто бывает так, что клиенту вообще не нужно обновлять статистику вручную.
  • Наконец, я отмечу, что влияние устаревшей статистики исторически заключалось в том, что вы получали регрессии выбора плана. Для повторяющихся запросов это влияние во многом было смягчено введением функции автоматической настройки в хранилище запросов (которая принудительно использует предыдущие планы, если замечает значительное снижение производительности запросов по сравнению с предыдущим планом).

Официальная рекомендация, которую я даю клиентам, состоит в том, чтобы не беспокоиться о перестроении индекса, если только у них нет приложения уровня 1, в котором они продемонстрировали реальную потребность (выгоды перевешивают затраты) или если они являются независимыми поставщиками ПО SaaS и пытаются настроить рабочую нагрузку. над многими базами данных/клиентами в эластичных пулах или в многопользовательской структуре базы данных, чтобы они могли снизить себестоимость производства или избежать нехватки места на диске (как упоминалось ранее) в очень большой базе данных. У крупнейших клиентов, которые есть у нас на платформе, мы иногда видим ценность в выполнении операций с индексами вручную с клиентом, но нам часто не нужно иметь постоянную работу, когда мы выполняем такие операции просто в кейс. Цель команды разработчиков SQL заключается в том, что вам вообще не нужно беспокоиться об этом, и вместо этого вы можете просто сосредоточиться на своем приложении. Конечно, всегда есть вещи, которые мы можем добавить или улучшить в наших автоматических механизмах, поэтому я полностью допускаю возможность того, что у отдельной клиентской базы данных может возникнуть потребность в таких действиях. Я сам не видел ничего, кроме случаев, которые я упомянул, и даже они редко являются проблемой.

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

Удачи - каким бы ни был ваш результат, я надеюсь, что это поможет вам сделать правильный выбор.

С уважением, Конор Каннингем Архитектор, SQL

person Conor Cunningham MSFT    schedule 28.07.2018
comment
Поздно на вечеринку, но я все равно спрошу: не играет ли здесь роль SKU, на котором работают их эластичные пулы? Если бы я запускал эластичные пулы в Premium или Business Critical, я, вероятно, не рассматривал бы книгу выполнения, которая выполняет написанную MS хранимую процедуру, выполняющую интеллектуальное и протоколируемое перестроение индекса, но в настоящее время мы делаем это, как мы в Standard. Другой аспект, который вступает в игру, заключается в том, что менеджер, зная достаточно, хочет знать, как часто перестраиваются индексы. Я понимаю, что это зависит, но менеджер - нет. - person jl.; 18.04.2019
comment
Мои комментарии действительно ортогональны тому, какой SKU вы используете - 15% либо достаточно, чтобы опрокинуть вас, либо нет, но это не сделает вас или не сломает, поскольку вы не будете все время работать на 100% процессоре. Для менеджера вы измеряете затраты (включая трудозатраты на перестройку и время, которое вы тратите на обслуживание системы без управления ресурсами, пока вы перестраиваете эти индексы в системе PaaS). Вы можете перестроить индексы, если это вас устраивает, но рефлекторные действия могут иметь больше психологической пользы, чем фактическая выгода во время выполнения :) - person Conor Cunningham MSFT; 19.04.2019
comment
Спасибо за ответ. - person jl.; 23.05.2019
comment
Это интересный ответ, я обнаружил, что мне нужно регулярно перестраивать индексы (по крайней мере, еженедельно), иначе они становятся фрагментированными, а приложение медленным и непригодным для использования. - person Craig; 10.08.2019
comment
Фрагментация индекса на SSD обычно не является основной причиной замедления работы приложений. Для большинства приложений это составляет около 15 % накладных расходов из-за наличия дополнительных операций ввода-вывода. Если вы можете посмотреть в хранилище запросов, чтобы увидеть производительность ключевых запросов до и после, можете ли вы проверить, что планы одинаковы до и после перестроения? Иногда перестроение индексов изменяет планы запросов, потому что вы обновляете статистику. В других случаях у вас есть чувствительность к параметрам, и перестроение вызывает принудительную перекомпиляцию (что не является причиной того, что приложение работает быстрее). Хотелось бы увидеть примеры. - person Conor Cunningham MSFT; 10.08.2019
comment
Я просто боролся с запросом, который возвращал только 5 строк: select top 1000 * from... заняло 0 секунд. select * from... заняло более 2 минут (и я его убил). Затем я увидел, что фрагментация одного конкретного индекса составляет 99%. Я перестроил его, и теперь оба запроса выполняются за 0 секунд. Это было на моем локальном хосте (SQL Server 12). Веб-приложение работает в Azure, и также есть несколько сильно фрагментированных индексов. Должен ли я перестраивать индексы только локально, но не в Azure? - person xavier; 03.09.2019
comment
Трудно сказать без дополнительных данных. если бы вы собирали заданный профиль статистики на выходе для запроса (без вершины), то мы могли бы сделать более обоснованное предположение. Кроме того, было бы полезно, если бы вы опубликовали, какая у вас модель хранилища (SSD, вращающиеся диски, SAN и т. д.). Выполнение перестроения индекса может обновить статистику, и это может привести к выбору лучшего плана, который мог решить вашу проблему, выбрав лучший вариант плана (вместо уменьшения фрагментации индекса как причины). - person Conor Cunningham MSFT; 04.09.2019
comment
Спасибо за ответ. Я был в отпуске. Мое локальное хранилище (без Azure) — это SSD (Toshiba KXG5AZNV512G). О статистике: я уже перестроил индекс, поэтому не знаю, будет ли полезна текущая статистика. Мне все равно их опубликовать? - person xavier; 09.09.2019
comment
Профиль статистики обычно может помочь показать, какая у вас проблема, если она связана с формой плана/выбором плана. Для некоторых форм плана вы потенциально можете сделать вывод о том, как фрагментация повредит вращающимся дискам. Что касается твердотельных накопителей, я думаю, вы, вероятно, должны предположить, что если перестроение вызвало большие изменения в производительности плана, это, вероятно, было проблемой выбора плана, а не проблемой фрагментации. Таким образом, лучше размещать его, когда проблема действительно есть, чем когда ее нет. - person Conor Cunningham MSFT; 09.09.2019
comment
Отлично, большое спасибо. Означает ли это, что я должен регулярно обновлять статистику на своем локальном хосте? А как насчет Azure SQL? Мне там тоже статистику обновлять или это уже сделано по умолчанию? - person xavier; 09.09.2019
comment
вам вообще не нужно регулярно обновлять статистику (при отсутствии какой-либо ошибки или другой проблемы с выбором плана — по умолчанию вы не должны обновлять статистику). Прочтите это: stackoverflow.com/questions/48681024/ - person Conor Cunningham MSFT; 10.09.2019
comment
Я знаю, что это год спустя, но я добавляю здесь комментарий о том, что у нас постоянно есть запросы, которые замедляются до МИНУТ, но после перестроения индексов для задействованных таблиц время запроса снова падает до секунд. Так что совет, что вам не нужно перестраивать индексы, по моему опыту просто не соответствует действительности. Я столкнулся с МНОЖЕСТВОМ проблем с производительностью, которые, похоже, решает перестроение индексов. И мы должны делать это регулярно, чтобы поддерживать производительность. - person pmbAustin; 06.10.2020
comment
Вы должны отделить влияние обновления статистики от перестроения индекса и посмотреть на планы запросов. Я не говорю, что перестроение индексов никогда не бывает полезным — просто в SQL Azure есть много случаев, когда у людей возникают сбои из-за перестроений, а не из-за влияния на производительность несколько неоптимальной структуры индексов. - person Conor Cunningham MSFT; 06.10.2020
comment
@ConorCunninghamMSFT Применимо ли это и к индексам каталогов полнотекстового поиска? Нужно ли запускать alter index для дефрагментации индексов? - person dejjub-AIS; 23.04.2021
comment
Полнотекстовые индексы — это разные звери. Это руководство предназначено в основном для обычных B-деревьев. Я считаю, что мы работали над официальной страницей документа, чтобы систематизировать текущее руководство, поэтому я попытаюсь обновить свой пост, как только найду ссылку для перенаправления людей на эту страницу в будущем. - person Conor Cunningham MSFT; 23.04.2021

Вы можете использовать автоматизацию Azure для планирования задач обслуживания индекса, как описано здесь:Перестроение индексов базы данных SQL с помощью службы автоматизации Azure

Ниже приведены шаги:

1) Создайте учетную запись службы автоматизации, если у вас ее нет, на странице https://portal.azure.com и выберите «Создать» > «Управление» > «Учетная запись автоматизации».

введите описание изображения здесь

2) После создания учетной записи автоматизации откройте сведения и нажмите «Runbooks» > «Просмотреть галерею».

введите описание изображения здесь

Введите в поле поиска слово «индексы», и появится runbook «Индексирует таблицы в базе данных Azure, если они имеют высокую фрагментацию»:

введите описание изображения здесь

4) Обратите внимание, что автором модуля Runbook является группа разработчиков SC Automation в Microsoft. Нажмите «Импорт»:

введите описание изображения здесь

5) После импорта модуля Runbook теперь давайте добавим учетные данные базы данных в активы. Нажмите «Активы» > «Учетные данные», а затем нажмите кнопку «Добавить учетные данные…». введите описание изображения здесь

6) Задайте имя учетных данных (которое будет использоваться позже в модуле Runbook), имя пользователя и пароль базы данных:

введите описание изображения здесь

7) Теперь снова щелкните Runbooks, затем выберите «Update-SQLIndexRunbook» из списка и нажмите кнопку «Изменить…». Вы сможете увидеть сценарий PowerShell, который будет выполнен:

введите описание изображения здесь

8) Если вы хотите протестировать скрипт, просто нажмите кнопку «Тестовая панель», и откроется тестовое окно. Введите необходимые параметры и нажмите «Пуск», чтобы выполнить перестроение индекса. Если возникает какая-либо ошибка, она регистрируется в окне результатов. Обратите внимание, что в зависимости от базы данных и других параметров это может занять много времени:

введите описание изображения здесь

9) Теперь вернитесь в редактор и нажмите кнопку «Опубликовать», чтобы включить модуль Runbook. Если мы нажмем «Пуск», появится окно с запросом параметров. Но поскольку мы хотим запланировать эту задачу, вместо этого мы нажмем кнопку «Запланировать»:

введите описание изображения здесь

10) Щелкните ссылку «Расписание», чтобы создать новое расписание для модуля Runbook. Я указал один раз в неделю, но это будет зависеть от вашей рабочей нагрузки и степени фрагментации ваших индексов с течением времени. Вам нужно будет настроить расписание в зависимости от ваших потребностей и выполнения начальных запросов между выполнениями:

введите описание изображения здесь

11) Теперь вводим параметры и запускаем настройки:

введите описание изображения здесь

ПРИМЕЧАНИЕ: вы можете играть с разными расписаниями с разными настройками, т. е. с определенным расписанием для определенного стола.

На этом вы закончили. Не забудьте изменить настройки ведения журнала по своему усмотрению:

введите описание изображения здесь

person Alberto Morillo    schedule 08.02.2018
comment
Какой отчет вы получите от этого? Это полезно? Можете ли вы как-нибудь запустить этот скрипт вручную - я бы хотел запустить его один раз и посмотреть, что он делает. Я нахожу много сценариев перестроения индекса, и я не хочу полностью блокировать процесс (по крайней мере, сначала). - person Simon_Weaver; 22.05.2018
comment
В этом модуле Runbook указано «Последнее обновление: 12.10.2014». Пробовали и тестировали? Или ужасно устаревшее :-/ Надеюсь, первое! - person Simon_Weaver; 22.05.2018
comment
Вы можете регистрировать результаты выполнения в базе данных SQL Azure systemcentercentral.com/. - person Alberto Morillo; 22.05.2018

Автоматизация Azure хороша, и цены также незначительны.

введите здесь описание изображения

Некоторые другие варианты, которые у вас есть,

1. Создайте задачу выполнения sql и запланируйте ее через агент sql. Задача выполнения sql должна содержать код перестроения индекса вместе с перестроением статистики.

2. Вы также можете создать связанный сервер с SQLAZURE и создать задание агента sql. Чтобы создать связанный сервер с лазурью, вы можете увидеть эту ссылку SO: Мне нужно добавить связанный сервер в MS Azure SQL Server

person TheGameiswar    schedule 09.02.2018

Как предложил @TheGamiswar, добавьте связанный сервер, а затем создайте хранимую процедуру следующим образом:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [LinkedServerName].[RemoteDB].[dbo].[sp_RebuildReorganizIndexes]   
AS  
BEGIN  
    ALTER INDEX PK_MyTable ON MyTable REBUILD WITH (STATISTICS_NORECOMPUTE = ON, ONLINE=ON);
    ALTER INDEX IX_MyTable ON MyTable REBUILD WITH (STATISTICS_NORECOMPUTE = ON, ONLINE=ON); --Nonclustered index

    ALTER INDEX PK_MyTable ON MyTable REORGANIZE;
    ALTER INDEX IX_MyTable ON MyTable REORGANIZE;
END

Затем на связанном сервере используйте «Агент SQL Server», чтобы создать новое задание и расписание:

введите здесь описание изображения

Для получения дополнительной информации см. https://docs.microsoft.com/en-us/sql/ssms/agent/create-a-job?view=sql-server-2017

person user8128167    schedule 09.09.2019

Вы можете рассмотреть возможность использования агента Azure Elastic Job для автоматизации обслуживания базы данных SQL Azure в нескольких базах данных в одном задании.

Подробнее об этом читайте на странице https://azureops.org/articles/automating-azure-sql-database-maintenance-tasks/

введите здесь описание изображения

person Kunal Rathi    schedule 09.05.2021

Помимо использования службы автоматизации Azure для автоматизации задания перестроения индексов в базе данных SQL Azure, вы также можете рассмотреть функцию Автоматическое управление индексами в базе данных SQL Azure, как описано в этом блог SQL Server Database Engine.

Вы можете сделать это, перейдя на портал Azure, перейдите в базу данных Azure SQL и выберите Автоматическая настройка. Если вы хотите, чтобы это было включено для всех ваших баз данных в определенном Azure SQL Server, вы также можете включить то же самое на Azure SQL Server.

введите здесь описание изображения

person juvchan    schedule 08.02.2018
comment
но разве это не просто варианты создания/удаления индексов? Мой вопрос касается их восстановления. Как я могу перестроить индексы с этими тремя вариантами? - person Ashkan Sirous; 09.02.2018
comment
не могли бы вы удалить этот ответ? Это может ввести людей в заблуждение. - person Ashkan Sirous; 09.03.2020