/
Настройка плана обслуживания базы SQL
Knowledge base Merchandising agency
Ask a question
Настройка плана обслуживания базы SQL
План
Сбор статистики - сделано
Дефрагментация и реиндексация.
Для того, чтобы бесполезно не тратить время сервера, и дефрагментацию и перестроение индексов делаем не по всей базе, а только по тем, где фрагментация превышает 10%. Если фрагментация выше 30% - то перестроение индекса. Позже можно будет скорректировать значения.Дефрагментация и реиндексация
USE OG_MERCHANT-- устанавливаем текущую базу SET NOCOUNT ON; -- отключаем вывод количества возвращаемых строк, это несколько ускорит обработку DECLARE @objectid int; -- ID объекта DECLARE @indexid int; -- ID индекса DECLARE @partitioncount bigint; -- количество секций если индекс секционирован DECLARE @schemaname nvarchar(130); -- имя схемы в которой находится таблица DECLARE @objectname nvarchar(130); -- имя таблицы DECLARE @indexname nvarchar(130); -- имя индекса DECLARE @partitionnum bigint; -- номер секции DECLARE @frag float; -- процент фрагментации индекса DECLARE @command nvarchar(4000); -- инструкция T-SQL для дефрагментации либо ренидексации -- Отбор таблиц и индексов с помощью системного представления sys.dm_db_index_physical_stats -- Отбор только тех объектов которые являются индексами (index_id > 0), -- фрагментация которых более 10% и количество страниц в индексе более 128 SELECT object_id AS objectid, index_id AS indexid, partition_number AS partitionnum, avg_fragmentation_in_percent AS frag INTO #work_to_do FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL , NULL, 'LIMITED') WHERE avg_fragmentation_in_percent > 5.0 AND index_id > 0 AND page_count > 128; -- Объявление курсора для чтения секций DECLARE partitions CURSOR FOR SELECT * FROM #work_to_do; -- Открытие курсора OPEN partitions; -- Цикл по секциям WHILE (1=1) BEGIN; FETCH NEXT FROM partitions INTO @objectid, @indexid, @partitionnum, @frag; IF @@FETCH_STATUS < 0 BREAK; -- Собираем имена объектов по ID SELECT @objectname = QUOTENAME(o.name), @schemaname = QUOTENAME(s.name) FROM sys.objects AS o JOIN sys.schemas as s ON s.schema_id = o.schema_id WHERE o.object_id = @objectid; SELECT @indexname = QUOTENAME(name) FROM sys.indexes WHERE object_id = @objectid AND index_id = @indexid; SELECT @partitioncount = count (*) FROM sys.partitions WHERE object_id = @objectid AND index_id = @indexid; -- Если фрагментация менее или равна 30% тогда дефрагментация, иначе реиндексация IF @frag <= 30.0 SET @command = N'ALTER INDEX ' + @indexname + N' ON ' + @schemaname + N'.' + @objectname + N' REORGANIZE'; IF @frag > 30.0 SET @command = N'ALTER INDEX ' + @indexname + N' ON ' + @schemaname + N'.' + @objectname + N' REBUILD'; IF @partitioncount > 1 SET @command = @command + N' PARTITION=' + CAST(@partitionnum AS nvarchar(10)); -- Если реиндексация, то для ускорения добавляем параметры использования TEMPDB(имеет смысл только если TempDB на отдельном физ. диске) и многопроцессорной обработки IF @frag > 30.0 SET @command = @command + N' WITH (SORT_IN_TEMPDB = ON, MAXDOP = 0)'; EXEC (@command); PRINT N'Executed: ' + @command; END; -- Закрытие курсора CLOSE partitions; DEALLOCATE partitions; -- Удаление временной таблицы DROP TABLE #work_to_do; GO
Ежедневный бэкап
, multiple selections available,
Related content
План обслуживания SQL-Сервера
План обслуживания SQL-Сервера
More like this
Удаление устаревших данных (регламентное задание)
Удаление устаревших данных (регламентное задание)
More like this
Ограничение выгрузки по направлению деятельности
Ограничение выгрузки по направлению деятельности
More like this
Расчет показателей потребности (регламентное задание)
Расчет показателей потребности (регламентное задание)
More like this
© Rassvet, 2020. Ask a question