From eab3945f0bb4b5cea8156c3582f02d8ef607238c Mon Sep 17 00:00:00 2001 From: Serge Date: Tue, 18 Apr 2023 13:55:44 +0300 Subject: [PATCH 1/2] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB?= =?UTF-8?q?=20=D0=B2=D0=BA=D0=BB=D1=8E=D1=87=D0=B5=D0=BD=D0=B8=D0=B5=20?= =?UTF-8?q?=D1=81=D1=82=D1=80=D0=B0=D0=BD=D0=B8=D1=87=D0=BD=D0=BE=D0=B9=20?= =?UTF-8?q?=D0=B1=D0=BB=D0=BE=D0=BA=D0=B8=D1=80=D0=BE=D0=B2=D0=BA=D0=B8=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D0=B8=D0=BD=D0=B4=D0=B5=D0=BA=D1=81=D0=BE?= =?UTF-8?q?=D0=B2=20=D1=81=20=D0=BF=D0=BE=D1=81=D0=BB=D0=B5=D0=B4=D1=83?= =?UTF-8?q?=D1=8E=D1=89=D0=B8=D0=BC=20=D0=BE=D1=82=D0=BA=D0=BB=D1=8E=D1=87?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=D0=BC.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Необходимо, потому что 1С, начиная с платформы 8.3.22 отключает страничную блокировку для всех индексов, а без этого невозможно сделать дефрагментацию или перестроение индекса. --- ...\272\320\270\321\205_\320\221\320\224.sql" | 39 ++++++++++++------- 1 file changed, 26 insertions(+), 13 deletions(-) diff --git "a/\320\236\320\261\321\201\320\273\321\203\320\266\320\270\320\262\320\260\320\275\320\270\320\265_\320\270\320\275\320\264\320\265\320\272\321\201\320\276\320\262_\320\275\320\265\321\201\320\272\320\276\320\273\321\214\320\272\320\270\321\205_\320\221\320\224.sql" "b/\320\236\320\261\321\201\320\273\321\203\320\266\320\270\320\262\320\260\320\275\320\270\320\265_\320\270\320\275\320\264\320\265\320\272\321\201\320\276\320\262_\320\275\320\265\321\201\320\272\320\276\320\273\321\214\320\272\320\270\321\205_\320\221\320\224.sql" index f5bb627..b4fde74 100644 --- "a/\320\236\320\261\321\201\320\273\321\203\320\266\320\270\320\262\320\260\320\275\320\270\320\265_\320\270\320\275\320\264\320\265\320\272\321\201\320\276\320\262_\320\275\320\265\321\201\320\272\320\276\320\273\321\214\320\272\320\270\321\205_\320\221\320\224.sql" +++ "b/\320\236\320\261\321\201\320\273\321\203\320\266\320\270\320\262\320\260\320\275\320\270\320\265_\320\270\320\275\320\264\320\265\320\272\321\201\320\276\320\262_\320\275\320\265\321\201\320\272\320\276\320\273\321\214\320\272\320\270\321\205_\320\221\320\224.sql" @@ -1,23 +1,26 @@ -------------------------------------------- +------------------------------------------- -- Скрипт выполняет реорганизацию либо дефрагменатцию индексов баз данных -- Алгоритм работы: -- 1. Отбираются базы данных по задаваемому условнию -- 2. Для каждой из баз данных: --- 2.1. Собираются информация обо всех фрагментированных индексах (степерь фрагментации более 5%) +-- 2.1. Собираются информация обо всех фрагментированных индексах (степень фрагментации более 5%) -- 2.2. Если фрагментация менее или равна 30% тогда выполняется дефрагментация, иначе реиндексация индекса -- 3. Отправляется электронное сообщение о результате работы с использованием настроенного почтового профиля -- Автор: Онянов Виталий (Tavalik.ru) +-- Чуть доработал Serge V. Ivanov в свзяи с тем, что 1С версий 8.3.22.хххх отключает блокировку страниц для всех индексов. +-- для возможности выполнения реорганизации или перестроения ее необходимо включать. Потом выключать. -- Версия от 09.08.2017 -- Свежие версии скриптов: https://github.com/Tavalik/SQL_TScripts --------------------------------------------- -- НАСТРАИВАЕМЫЕ ПАРАМЕТРЫ -- Условие для выборки, '%' - все базы данных -DECLARE @namelike varchar(100) = 'WorkBase%' +DECLARE @namelike varchar(100) = '%' + -- Имя почтового профиля, для отправки электонной почты -DECLARE @profilename as nvarchar(100) = 'ОсновнойПрофиль' +DECLARE @profilename as nvarchar(100) = 'mail.ru' -- Получатели сообщений электронной почты, разделенные знаком ";" -DECLARE @recipients as nvarchar(500) = 'admin@mydomen.com' +DECLARE @recipients as nvarchar(500) = 'ivanov@kpd-cargo.com' ------------------------------------------- -- СЛУЖЕБНЫЕ ПЕРЕМЕННЫЕ @@ -62,6 +65,13 @@ WHILE @@FETCH_STATUS = 0 SET @command = N'USE [' + @database_name + N'] + ----------------------------------------------------------------------- SET it -------------------------- + -- минимальное кол-во страниц в индексе для обработки + DECLARE @minpages as int = 10 + -- Минимальный процент дефрагментации для ребилда + DECLARE @minpercent as float = 10 + --------------------------------------------------------------------------------------------------------- + DECLARE @object_id int; -- ID объекта DECLARE @index_id int; -- ID индекса DECLARE @partition_number bigint; -- количество секций если индекс секционирован @@ -75,8 +85,8 @@ WHILE @@FETCH_STATUS = 0 -- Отбор таблиц и индексов с помощью системного представления sys.dm_db_index_physical_stats -- Отбор только тех объектов которые: -- являются индексами (index_id > 0) - -- фрагментация которых более 5% - -- количество страниц в индексе более 128 + -- фрагментация которых более @minpercent + -- количество страниц в индексе более @minpages SELECT object_id, index_id, @@ -85,8 +95,8 @@ WHILE @@FETCH_STATUS = 0 INTO #work_to_do FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL , NULL, ''LIMITED'') WHERE index_id > 0 - AND avg_fragmentation_in_percent > 5.0 - AND page_count > 128; + AND avg_fragmentation_in_percent > @minpercent + AND page_count > @minpages; -- Объявление Открытие курсора курсора для чтения секций DECLARE partitions CURSOR FOR SELECT * FROM #work_to_do; @@ -112,9 +122,11 @@ WHILE @@FETCH_STATUS = 0 WHERE object_id = @object_id AND index_id = @index_id; -- Если фрагментация менее или равна 30% тогда дефрагментация, иначе реиндексация - IF @fragmentation_in_percent < 30.0 + -- Разрешаем блокировку страниц + SET @command = N''ALT ER INDEX '' + @indexname + N'' ON '' + @schemaname + N''.'' + @objectname + N'' SET (ALLOW_PAGE_LOCKS = ON, ALLOW_ROW_LOCKS = ON);''; + IF @fragmentation_in_percent < @MinPercent SET @command = N''ALTER INDEX '' + @indexname + N'' ON '' + @schemaname + N''.'' + @objectname + N'' REORGANIZE''; - IF @fragmentation_in_percent >= 30.0 + IF @fragmentation_in_percent >= @MinPercent SET @command = N''ALTER INDEX '' + @indexname + N'' ON '' + @schemaname + N''.'' + @objectname + N'' REBUILD''; IF @partition_number > 1 SET @command = @command + N'' PARTITION='' + CAST(@partition_number AS nvarchar(10)); @@ -122,7 +134,8 @@ WHILE @@FETCH_STATUS = 0 -- Выполняем команду PRINT N'' Executed: '' + @command; EXEC sp_executesql @command - + -- Снова запрещаем блокировку страниц + SET @command = @command + N''ALT ER INDEX '' + @indexname + N'' ON '' + @schemaname + N''.'' + @objectname + N'' SET (ALLOW_PAGE_LOCKS = OFF , ALLOW_ROW_LOCKS = ON);''; -- Следующий элемент цикла FETCH NEXT FROM partitions INTO @object_id, @index_id, @partition_number, @fragmentation_in_percent; @@ -175,4 +188,4 @@ SELECT @subject as subject, @finalmassage as finalmassage -GO +GO \ No newline at end of file From 38c7f2059d14ec3670114790837267eb056eb2fe Mon Sep 17 00:00:00 2001 From: Serge Date: Wed, 19 Apr 2023 11:28:02 +0300 Subject: [PATCH 2/2] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=BF=D1=80=D0=BE=D1=84=D0=B8=D0=BB=D1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\273\321\214\320\272\320\270\321\205_\320\221\320\224.sql" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/\320\236\320\261\321\201\320\273\321\203\320\266\320\270\320\262\320\260\320\275\320\270\320\265_\320\270\320\275\320\264\320\265\320\272\321\201\320\276\320\262_\320\275\320\265\321\201\320\272\320\276\320\273\321\214\320\272\320\270\321\205_\320\221\320\224.sql" "b/\320\236\320\261\321\201\320\273\321\203\320\266\320\270\320\262\320\260\320\275\320\270\320\265_\320\270\320\275\320\264\320\265\320\272\321\201\320\276\320\262_\320\275\320\265\321\201\320\272\320\276\320\273\321\214\320\272\320\270\321\205_\320\221\320\224.sql" index b4fde74..572dae8 100644 --- "a/\320\236\320\261\321\201\320\273\321\203\320\266\320\270\320\262\320\260\320\275\320\270\320\265_\320\270\320\275\320\264\320\265\320\272\321\201\320\276\320\262_\320\275\320\265\321\201\320\272\320\276\320\273\321\214\320\272\320\270\321\205_\320\221\320\224.sql" +++ "b/\320\236\320\261\321\201\320\273\321\203\320\266\320\270\320\262\320\260\320\275\320\270\320\265_\320\270\320\275\320\264\320\265\320\272\321\201\320\276\320\262_\320\275\320\265\321\201\320\272\320\276\320\273\321\214\320\272\320\270\321\205_\320\221\320\224.sql" @@ -18,9 +18,9 @@ DECLARE @namelike varchar(100) = '%' -- Имя почтового профиля, для отправки электонной почты -DECLARE @profilename as nvarchar(100) = 'mail.ru' +DECLARE @profilename as nvarchar(100) = 'profile' -- Получатели сообщений электронной почты, разделенные знаком ";" -DECLARE @recipients as nvarchar(500) = 'ivanov@kpd-cargo.com' +DECLARE @recipients as nvarchar(500) = 'admin@mydomen.com' ------------------------------------------- -- СЛУЖЕБНЫЕ ПЕРЕМЕННЫЕ