Скрипты для анализа индексов в базе
данных
Данный материал предназначен для продвинутых пользователей. Если у вас есть вопросы по применению, обратитесь в Техническую поддержку BPMSoft.
Если производительность запросов на уровне базы данных BPMSoft снижается, то необходимо проверить состояние индексов. Частые операции с данными могут привести к фрагментации индексов и устареванию статистики, что влечет формирование неоптимальных планов запросов.
Регулярное обслуживание индексов — перестроение, реорганизация и обновление статистики — помогает поддерживать высокую производительность базы данных. Ниже приведены скрипты для анализа состояния индексов.
Скрипты для Microsoft SQL Server
SELECT
TableName = t.name,
ColumnName = col.name,
IndexId = ind.index_id,
IndexName = ind.name,
ColumnId = ic.index_column_id,
s.LastStatsUpdate
FROM
sys.indexes ind
INNER JOIN
sys.index_columns ic ON ind.object_id = ic.object_id and ind.index_id = ic.index_id
INNER JOIN
sys.columns col ON ic.object_id = col.object_id and ic.column_id = col.column_id
INNER JOIN
sys.tables t ON ind.object_id = t.object_id
Left JOIN
(
select [object_id], MAX(STATS_DATE([object_id], stats_id)) AS LastStatsUpdate
from sys.stats
group by [object_id]
) as s ON s.object_id = t.object_id
WHERE
ind.is_primary_key = 0
AND ind.is_unique = 0
AND ind.is_unique_constraint = 0
AND t.is_ms_shipped = 0
ORDER BY
t.name, ind.name, ind.index_id, ic.is_included_column, ic.key_ordinal;
declare @DB sysname = N''; select s.name schema_name, t.name TableName, i.name IndexName, d.avg_fragmentation_in_percent Fragmentation, d.page_count from sys.dm_db_index_physical_stats( DB_ID(@DB), null, null, null, null) d inner join sys.tables t on d.object_id = t.object_id inner join sys.schemas s on t.schema_id = s.schema_id inner join sys.indexes i on d.object_id = i.object_id AND d.index_id = i.index_id --where d.index_id > 0 and d.page_count > 8 order by t.name asc, i.name asc
Скрипты для PostgreSQL
/* indexrelname: Имя индекса. idx_scan: Количество сканов индекса, использованных для поиска данных. idx_tup_fetch: Количество взятых из индекса кортежей. idx_tup_read: Количество прочитанных из индекса кортежей. idx_bytes: Размер индекса в байтах. indexrelpages: Количество страниц индекса. indexrelpages/filereelpages: Процент заполненности страниц индекса (может указывать на фрагментацию). */ SELECT * FROM pg_stat_all_indexes order by "indexrelname"
SELECT
tablename,
indexname,
indexdef
FROM
pg_indexes
WHERE
schemaname = 'public'
ORDER BY
--tablename,
indexname desc;
Обслуживание индексов
В зависимости от результатов анализа можно применить следующие методы обслуживания:
- Перестроение индексов (Rebuild).
Перестроение индекса создает его заново, устраняя фрагментацию. Этот метод подходит для индексов с высокой фрагментацией (>30%).
Индексы содержающие Guid всегда будут иметь высокую фрагментацию.
- Реорганизация индексов (Reorganize).
Реорганизация исправляет фрагментацию без полного пересоздания индекса. Этот метод быстрее перестроения и подходит для умеренной фрагментации.
- Обновление статистики.
Обновление статистики делает ее актуальной, что улучшает планы запросов и оптимизирует доступ к данным.