Дефрагментация и реиндексация после перехода на платформу 8.3.22

14.09.23

Разработка - Механизмы платформы 1С

Начиная с версии платформы 8.3.22 1С снимает стандартные блокировки БД на уровне страниц. Делаем рабочий скрипт, как раньше.

В соответствии с вот этой вот статьей: https://its.1c.ru/db/metod8dev/content/5837/hdoc начиная с версии платформы 8.3.22 1С снимает стандартные блокировки БД на уровне страниц. Вообще снимает.

Поэтому любые попытки обслужить базы - реиндексации и дефрагментации - в БД средствами SQL вызывают ошибки - "невозможно ... поскольку отключена блокировка на уровне страницы" Дефрагментация индексов и реиндексация баз при этом являются требованием при обслуживании баз 1с (на что прямо указывается в этой же статье)

В этой же статье, в разделе "Дефрагментация индексов" упоминается использование команды:

ALTER INDEX ALTER INDEX index_name ON table_name SET (ALLOW_PAGE_LOCKS = ON, ALLOW_ROW_LOCKS = ON);

для включения блокировок в таблицах.

Однако реальное использование этой команды со всеми ее параметрами в контексте работы именно с 1С не расписано.

На самом деле необходимо осуществить:

  • выбор базы,
  • затем перебор всех таблиц в базе с перебором всех нестандартных индексов в базе ...
  • включить блокировку
  • затем осуществить выбор базы + перебор всех таблиц в базе + перебор всех нестандартных индексов в базе ...
  • выключить блокировку.

Далее предлагается шаблон скрипта, который выполняет эту функцию

Автор сего скрипта //infostart.ru/profile/411182/, я публикую с его разрешения.

DECLARE @DBName varchar(255)
DECLARE @TEMPLATE VARCHAR(MAX)
DECLARE @SQL_SCRIPT VARCHAR(MAX)

DECLARE @TableName varchar(255)
DECLARE @IndexName varchar(255)
DECLARE @TEMPLATE_DB VARCHAR(MAX)

SET @TEMPLATE = 
    'DECLARE contact_cursor CURSOR FOR
    SELECT
        tab.name as tabName,
        ind.name as indName
    FROM [{DBNAME}].[sys].[tables] as tab
        inner join [{DBNAME}].[sys].[indexes] as ind on tab.object_id = ind.object_id
    WHERE ind.allow_page_locks = 0
        and ind.name is not null'

SET @TEMPLATE_DB =
    'ALTER INDEX [{INDEXNAME}] ON [{DBNAME}].[dbo].[{TABLENAME}] SET (ALLOW_PAGE_LOCKS = ON, ALLOW_ROW_LOCKS = ON)
    ALTER INDEX [{INDEXNAME}] ON [{DBNAME}].[dbo].[{TABLENAME}] REORGANIZE WITH (LOB_COMPACTION = ON)
    ALTER INDEX [{INDEXNAME}] ON [{DBNAME}].[dbo].[{TABLENAME}] SET (ALLOW_PAGE_LOCKS = OFF, ALLOW_ROW_LOCKS = ON)'

DECLARE db_cursor CURSOR FOR
SELECT
    db.name as dbName
FROM
    [master].[sys].[databases] as db
WHERE db.owner_sid <> 0x01 and db.state_desc = 'ONLINE'

OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @DBName
WHILE @@FETCH_STATUS = 0
BEGIN
    PRINT @DBNAme
    SET @SQL_SCRIPT = REPLACE(@TEMPLATE, '{DBNAME}', @DBName)
    EXECUTE(@SQL_SCRIPT)

    OPEN contact_cursor
    FETCH NEXT FROM contact_cursor INTO @TableName, @IndexName
    WHILE @@FETCH_STATUS = 0
    BEGIN
        PRINT '    Table: ' + @TableName + '; Index: ' + @IndexName
        SET @SQL_SCRIPT = REPLACE(@TEMPLATE_DB, '{DBNAME}', @DBName)
        SET @SQL_SCRIPT = REPLACE(@SQL_SCRIPT, '{INDEXNAME}', @IndexName)
        SET @SQL_SCRIPT = REPLACE(@SQL_SCRIPT, '{TABLENAME}', @TableName)
        EXECUTE(@SQL_SCRIPT)
        FETCH NEXT FROM contact_cursor INTO @TableName, @IndexName
    END
    CLOSE contact_cursor
    DEALLOCATE contact_cursor

    FETCH NEXT FROM db_cursor INTO @DBName
END

CLOSE db_cursor
DEALLOCATE db_cursor
GO

 

DatabaseCompressionTool — сжатие и свертка любой базы 1С

Инструмент DatabaseCompressionTool (DCT) позволяет безопасно сжать и свернуть любую базу 1С, освободив сотни гигабайт и увеличив производительность системы. Доступна демо-версия для оценки эффективности.


Вступайте в нашу телеграмм-группу Инфостарт

SQL блокировки. 22 плаформа

См. также

Механизмы платформы 1С Программист Бесплатно (free)

Разберем 15 мифов о работе платформы «1С:Предприятие 8» – как распространенных, так и малоизвестных. Начнем с классики: «Код, написанный в одну строку, работает быстрее, чем многострочный». Так ли это на самом деле?

16.07.2025    24160    TitanLuchs    106    

143

Механизмы платформы 1С Работа с интерфейсом Программист Стажер 1С:Предприятие 8 Бесплатно (free)

Про ООП в 1С и о том, как сделать свой код более кратким и выразительным при помощи использования текучего интерфейса (fluent interface).

03.02.2025    13354    bayselonarrend    127    

67

Механизмы платформы 1С WEB-интеграция Программист 1С:Предприятие 8 Бесплатно (free)

В платформе 8.3.27 появилась возможность использовать WebSocket-клиент. Давайте посмотрим, как это все устроено и чем оно нам полезно.

14.01.2025    24450    dsdred    77    

140

Механизмы платформы 1С Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Эта небольшая статья - некоторого рода шпаргалка по файловым потокам: как и зачем с ними работать, какие преимущества это дает.

23.06.2024    22800    bayselonarrend    22    

172

Механизмы платформы 1С Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Пример использования «Сервисов интеграции» без подключения к Шине и без обменов.

13.03.2024    12681    dsdred    22    

85

Механизмы платформы 1С Программист Стажер 1С:Предприятие 8 Бесплатно (free)

Все мы используем массивы в своем коде. Это один из первых объектов, который дают ученикам при прохождении обучения программированию. Но умеем ли мы ими пользоваться? В этой статье я хочу показать все методы массива, а также некоторые фишки в работе с массивами.

24.01.2024    45630    YA_418728146    35    

78
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Xershi 1531 15.09.23 09:56 Сейчас в теме
Почитал статью на ИТС при перестроении индексом ничего не меняется пишут, только при дефрагментации.
AndreyCheh; gzharkoj; TSSV; +3 Ответить
8. a.doroshkevich 1364 17.09.23 14:30 Сейчас в теме
Можно гораздо проще:

USE имя базы
EXEC sp_MSforeachtable 'ALT ER INDEX ALL ON ? SET (ALLOW_PAGE_LOCKS = ON)'
GO
SerVer1C; +1 Ответить
22. SerVer1C 993 02.10.23 15:29 Сейчас в теме
(8) С Вашего позволения приведу полный скрипт, т.к. не все в скулях шарят.

EXEC sp_msforeachtable 'ALT ER INDEX ALL ON ? SET (ALLOW_PAGE_LOCKS = ON, ALLOW_ROW_LOCKS = ON)'
EXEC sp_msforeachtable 'ALT ER INDEX ALL ON ? REORGANIZE WITH (LOB_COMPACTION = ON)'
EXEC sp_msforeachtable 'ALT ER INDEX ALL ON ? SET (ALLOW_PAGE_LOCKS = OFF, ALLOW_ROW_LOCKS = ON)'
GO

* <ALTER> пишется слитно
unknown181538; Aero; shaykhelov; kDymok; +4 Ответить
26. user2007983 15.11.23 11:07 Сейчас в теме
(22)
EXEC sp_msforeachtable 'ALT ER INDEX ALL ON ? SET (ALLOW_PAGE_LOCKS = ON, ALLOW_ROW_LOCKS = ON)'
EXEC sp_msforeachtable 'ALT ER INDEX ALL ON ? REORGANIZE WITH (LOB_COMPACTION = ON)'
EXEC sp_msforeachtable 'ALT ER INDEX ALL ON ? SET (ALLOW_PAGE_LOCKS = OFF, ALLOW_ROW_LOCKS = ON)'
GO


я правильно понимаю, что дефрагментацию индекса надо вставить после строчки с LOB ? Или в данном скрипте это вообще не нужно?
27. SerVer1C 993 15.11.23 11:10 Сейчас в теме
(26) этот скрипт из трёх строчек самодостаточен и заменяет огромный скрипт из публикации.
2. redfred 15.09.23 10:22 Сейчас в теме
SEL ECT
    db.name as dbName
FR OM
    [master].[sys].[databases] as db
WHERE db.owner_sid <> 0x01 and db.state_desc = 'ONLINE'


Это что бы отфильтровать системные базы? А если у пользовательских тоже будет владелец sa? Лучше вместо db.owner_sid использовать db.database_id > 4
3. JohnyDeath 302 15.09.23 10:39 Сейчас в теме
Для обслуживания индексов и статистики я использую https://ola.hallengren.com/sql-server-index-and-statistics-maintenance.html
Чего и всем советую.
begemot; user1252642; sashocq; Shmell; adamst; +5 Ответить
4. TimurD 6 15.09.23 13:10 Сейчас в теме
(3) В новом курсе про производительность Бурмистров рассказывает про этот функционал, как замена старых скриптов)
6. human_new 708 15.09.23 16:23 Сейчас в теме
(4) А что именно, их теперь вообще делать не нужно? Просто у большинства данный скрипт отвалился, план обслуживания мало кто перекраивал, но мало кто заметил разницу...
7. JohnyDeath 302 15.09.23 16:31 Сейчас в теме
(6) какой скрипт отвалится? от 1с? "DBCC INDEXDEFRAG"?
скрипты от "ola" не имеют этой команды.
А вообще на всех скуль-серверах должны быть настроены mail-оповещения о всех неудачах.
Да, такое редко когда кто-то настраивает и посыпает голову пеплом только в тот момент, когда уже "поздно". Примерно как не делать бекапы )
И еще рекомендую провериться вот этим скриптом https://www.brentozar.com/blitz/ . Можно много интересного узнать о своем сервере и базах. В том числе и о не настроенном оповещении
begemot; sashocq; +2 Ответить
16. redfred 18.09.23 17:31 Сейчас в теме
(3) Олавский скрипт, кстати, просто молча игнорирует подобные индексы с выключенным page lock при реорганизации, так что тоже не панацея
17. chg 20.09.23 05:42 Сейчас в теме
(3)тоже сейчас смотрю, как понимаю что в скрипте кроме используемой БД, нужно и ещё куча параметров под себя менять?
18. JohnyDeath 302 20.09.23 08:15 Сейчас в теме
(17) так все параметры вынесены наружу и подробно описаны на странице, что я привел выше
Даже есть куча примеров внизу страницы.
H. Rebuild or reorganize all indexes with fragmentation on the table Production.Product in the database AdventureWorks
EXECUTE dbo.IndexOptimize
@Databases = 'AdventureWorks',
@FragmentationLow = NULL,
@FragmentationMedium = 'INDEX_REORGANIZE,INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE',
@FragmentationHigh = 'INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE',
@FragmentationLevel1 = 5,
@FragmentationLevel2 = 30,
@Indexes = 'AdventureWorks.Production.Product'
Показать


Также рекомендую почитать рекомендацию Брентозара на параметры для этого скрипта: https://www.brentozar.com/archive/2014/12/tweaking-defaults-ola-hallengrens-maintenance-scripts/
32. vatkir 20 28.11.25 22:22 Сейчас в теме
(3) Мне удалось скрипт переписать чтобы он снова выполнял REORGANIZE, временно включая блокировку страниц для индекса. Процедура IndexOptimize из MaintenanceSolution от Ola Hallengren просто пропускала реорганизацию индексов, если выключен ALLOW_PAGE_LOCKS, а с 8.3.22 платформы у всех индексов этот флаг снят. Удалось сделать чтобы скрипт вёл себя именно так, как советуют на ИТС: https://its.1c.ru/db/metod8dev/content/5837/hdoc

Теперь IndexOptimize во первых обрабатывает индексы у которых ALLOW_PAGE_LOCKS = OFF, во вторых временно им ставит ALLOW_PAGE_LOCKS = ON, а после обработки возвращает.

Доработанный скрипт выложу у себя в профиле
5. Jimbo 13 15.09.23 14:44 Сейчас в теме
Непонятно - зачем это вот всё ? 22я лучше работает или нет ? Что нам дадут эти страницы ? Или для эскалации блокировок подымаемся от уровня строк сразу на всю таблицу целиком , мимо уровня страниц?
triviumfan; +1 Ответить
9. a.doroshkevich 1364 17.09.23 14:32 Сейчас в теме
(5)Затем что эскалация страничной блокировки достаточно часто я является проблемой.
Механизм управляемых блок ровок 1с не может действовать на этот вид эскалации, поэтому в мире 1с этот флаг трассировки ms sql полезен
10. redfred 17.09.23 16:30 Сейчас в теме
(9)
Затем что эскалация страничной блокировки достаточно часто я является проблемой.


Но ведь блокировки на уровне строк тоже эскалируются. Какая разница, по сути?
11. a.doroshkevich 1364 17.09.23 16:35 Сейчас в теме
(10) нет, они давно выключены, 1с отправляет этот флаг в ms SQL, этот тип эскалации происходит на уровне сервера 1с и соответственно система об этом в курсе
А страничная эскалация идет на более низком уровне
12. redfred 18.09.23 09:15 Сейчас в теме
(11) Разве есть отдельные флаги для отключения разных уровней эскалации блокировок? Вроде их всего два было - один для отключения триггера экскалации по количеству локов, второй - по занимаемой локами памяти, но, емнип, там без всякого различия страничные это локи или на строках. Или речь о чем-то другом?
13. a.doroshkevich 1364 18.09.23 09:45 Сейчас в теме
(12)Извиняюсь, некорректно выразился
Флага отдельного действительно нет
Но платформа берёт управление блокировками строк на себя. в том числе и эскалацию при достижении 100 000 строк (в MS SQL этот порог 10 000 насколько я помню)
А вот страничную эскалацию платформа на себя взять не может, так как только субд знает как данные в страницах лежат
В итоге получаем неприятные моменты блокировок и таймаутов
14. redfred 18.09.23 10:11 Сейчас в теме
15. starik-2005 3201 18.09.23 10:31 Сейчас в теме
22-й платформе сто лет в обед, а тут всплывает внеочередной раз юзер, который увидел в логе скула ошибок и пошел гуглить, и результаты гугления на инфостарт постить. Не, ну а чо...
19. ITEkb 21.09.23 06:48 Сейчас в теме
(15) Не все живут на Инфостарте, переход на последние версии далеко не многие практикуют.
Только когда конфигурации вынудят.
Количество комментаторов тоже говорит об актуальности темы.
У меня тема решена, но все же зашел еще раз убедиться в правильности выбранного решения.
И за ссылку на Brent Ozar отдельная благодарность.
oneworker; +1 Ответить
20. andrew.ab 231 26.09.23 13:00 Сейчас в теме
Еще один из вариантов скрипта.
Прикрепленные файлы:
SQLQuery_Rebuild_Reindex_8.3.22.xx.sql
user926893; jawakharlal; +2 Ответить
21. AndreyCheh 28.09.23 15:27 Сейчас в теме
Подскажите пожалуйста. Правильно ли понимаю что дефрагментация = реорганизация? Что в 8.3.22 перестала работать именно реорганизация, а перестроение индекса срабатывает нормально? У себя проверил - реорганизация не выполнилась, но перестроение выполняется.
И если с перестроением индекса проблем нет, то обязательно ли делать реорганизацию? Допустим, настроена ежедневная реорганизация, которая перестала выполняться и еженедельное перестроение индекса. Возможно допустимо оставить только перестроение? Последнее, кстати, в моем случае, выполняется достаточно быстро.
23. human_new 708 06.10.23 13:12 Сейчас в теме
(21) Хорошо, что у вас успевает выполняться перестроение. Да, по факту база будет работать и вообще без скриптов. Перестроеяния конечно будет достаточно. Тут больше вопрос нюансов производительности и на практике их проверить довольно сложно, от этого и нет четких ответов.
AndreyCheh; +1 Ответить
24. user1540892 31.10.23 05:55 Сейчас в теме
Добрый день!
Столкнулся с такой же проблемой после перехода на платформу 8.3.22., что не получается обслужить БД средствами SQL сервера.
Так как сам писать/читать скрипты не умею, прошу помочь адаптировать скрипт из шапки для моей БД. Я просто не могу понять как использовать скрипт, и где в нем указывать что он должен работать с определенной БД.
Очень рад буду помощи, очень сильно хочу спать коллеги, придите пожалуйста на помощь.
25. user1540892 31.10.23 10:29 Сейчас в теме
(24) Дополню что нашел такой скрипт

USE Название моей базы
EXEC sp_MSforeachtable 'ALT ER INDEX ALL ON ? SET (ALLOW_PAGE_LOCKS = ON)'
GO

решает вроде бы проблему, но не на всех базах данных.
_______________________________
Буду рад помощи
DimonNT; monwig; +2 Ответить
28. kauksi 217 24.02.25 12:33 Сейчас в теме
Как быть если включение страничных блокировок занимает 8 часов, а сама реиндексация 11 сек. Может вообще тогда забить?
29. x2002 12.05.25 08:00 Сейчас в теме
У меня в эксплуатации УТ 10.3 обычные формы. Платформа 1С:Предприятие 8.3 (8.3.25.1501) Включение построчных блокировок увеличивает время выполнения запроса в открытой транзакции в 10-20 раз. В результате некоторые документы проводятся вместо 1 секунды - 15, что создает дискомфорт. Включается самостоятельно при каждом обновлении конфигурации. Приходится после каждого обновления отключать построчную и включать постраничную блокировку. Кто-то сталкивался с таким эффектом? Может кто-то что-то посоветует? Косяк платформы?
Советовать переход на УФ не нужно.
30. theshef21 17.05.25 17:37 Сейчас в теме
Стоит сервер 1С Предприятие 8.3.26.1540 + Microsoft SQL Server 2022.
Планы обслуживания прописаны в Microsoft SQL Server Management Studio (SSMS).
Есть план обслуживания "Обслуживание раз в неделю", идет по плану:
1. Проверка целостности базы данных
2. Реорганизация индекса (не выполняется - ошибка "Невозможно реорганизовать индекс...поскольку отключена блокировка на уровне страницы"
3. Перестроение индекса
4. Обновление статистик
5. Выполнение инструкция T-SQL
6. Очистка журнала

Все равно не пойму… а вся информация в интернете ведет на то, что:
- до выполнения «Реорганизация индексов» нужно вставить T-SQL код, в котором я должен включить блокировки станиц с указанием в этом коде «ИМЯ таблицы/базы».
- после выполнения «Реорганизация индексов» нужно вставить T-SQL код, в котором я должен выключить блокировки станиц с указанием в этом коде «ИМЯ таблицы/базы».

Но у меня много баз 1С (47 штук) в плане обслуживания. И как их, каждую прописывать в T-SQL коде на включение блокировок станиц? Каждой новой строкой писать имена баз?
31. user1937556 21.05.25 07:15 Сейчас в теме
(30) Вообще дефрагментация перед перестроением раз в неделю лишена смысла.
Прикрепленные файлы:
Для отправки сообщения требуется регистрация/авторизация