Published on

August 4, 2020

Понимание обслуживания индексов в SQL Server

Обслуживание индексов является важным аспектом поддержки здоровой базы данных SQL Server. Регулярное перестроение и переорганизация индексов важны, но также важно понимать использование индексов в вашей базе данных. Очистка неиспользуемых индексов может значительно снизить нагрузку на операции вставки, обновления и удаления.

Один из способов начать процесс очистки индексов – проверить, были ли поиски или сканирования по индексу. Это можно сделать с помощью скрипта, приведенного ниже:

SELECT d.name,
       OBJECT_NAME(i.[object_id]) AS [ObjectName],
       i.[name] AS [IndexName],
       s.user_seeks,
       s.user_scans
FROM sys.indexes AS i
    LEFT OUTER JOIN sys.dm_db_index_usage_stats AS s
        ON i.[object_id] = s.[object_id]
           AND i.index_id = s.index_id
           AND s.database_id = DB_ID()
    JOIN sys.databases d
        ON d.database_id = s.database_id
WHERE OBJECTPROPERTY(i.[object_id], 'IsUserTable') = 1
ORDER BY s.user_seeks + s.user_scans + s.user_lookups DESC
OPTION (RECOMPILE);

Однако, при работе с Azure SQL Database есть дополнительные моменты, которые следует учитывать. Статистика индексов в Azure SQL Database переинициализируется при перезапуске экземпляра, на котором работает ваша база данных или эластичный пул. Это означает, что статистика индексов может недостоверно отражать использование индексов, если база данных или эластичный пул были перезапущены.

Для виртуальных машин Azure или локальных экземпляров SQL Server легко определить, когда происходят перезапуски. Однако, с Azure SQL Database мы не имеем контроля над временем перезапусков. Это становится еще более сложным, если учесть предложение Serverless, которое приостанавливает неиспользуемые базы данных для снижения затрат.

При использовании базы данных Serverless статистика индексов также переинициализируется каждый раз, когда база данных возобновляется после приостановки. Это представляет собой вызов при попытке определить использование индексов для целей очистки и обслуживания.

Чтобы преодолеть эту проблему, рекомендуется запросить время запуска экземпляра с помощью следующего скрипта:

SELECT sqlserver_start_time
FROM sys.dm_os_sys_info;

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

Важно знать об этих ограничениях при использовании опции Serverless для вашей базы данных Azure SQL. Несмотря на то, что она предлагает выгоды с точки зрения экономии затрат, важно понимать возможные недостатки, такие как переинициализация статистики индексов при возобновлении приостановленной базы данных.

Тем временем, вы можете попробовать сохранить данные статистики индексов с помощью представлений динамического управления (DMV) и записать их в таблицу. Это поможет вам поддерживать историческую запись использования индексов и принимать более обоснованные решения о очистке и обслуживании индексов.

Понимание обслуживания индексов и поведения статистики индексов в Azure SQL Database является важным для обеспечения оптимальной производительности базы данных и использования ресурсов.

Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.