Дефрагментация и реиндексация после перехода на платформу 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

 

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

См. также

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

23.06.2024    7400    bayselonarrend    19    

154

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

13.03.2024    5934    dsdred    16    

80

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

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

24.01.2024    17606    YA_418728146    26    

71

Перенос данных 1C Механизмы платформы 1С Системный администратор Программист Стажер Платформа 1С v8.3 Бесплатно (free)

Вы все еще регистрируете изменения только на Планах обмена и Регистрах сведений?

11.12.2023    11206    dsdred    44    

130

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

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    23744    SeiOkami    48    

135

WEB-интеграция Универсальные функции Механизмы платформы 1С Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    14721    YA_418728146    7    

166

Механизмы платформы 1С Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Внешние компоненты для 1С можно разработывать очень просто, пользуясь всеми преимуществами языка Rust - от безопасности и кроссплатформенности до удобного менеджера библиотек.

20.08.2023    8370    sebekerga    55    

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

USE имя базы
EXEC sp_MSforeachtable 'ALT ER INDEX ALL ON ? SET (ALLOW_PAGE_LOCKS = ON)'
GO
SerVer1C; +1 Ответить
22. SerVer1C 815 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> пишется слитно
Aero; shaykhelov; kDymok; +3 Ответить
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 815 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 694 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/
5. Jimbo 10 15.09.23 14:44 Сейчас в теме
Непонятно - зачем это вот всё ? 22я лучше работает или нет ? Что нам дадут эти страницы ? Или для эскалации блокировок подымаемся от уровня строк сразу на всю таблицу целиком , мимо уровня страниц?
triviumfan; +1 Ответить
9. a.doroshkevich 1496 17.09.23 14:32 Сейчас в теме
(5)Затем что эскалация страничной блокировки достаточно часто я является проблемой.
Механизм управляемых блок ровок 1с не может действовать на этот вид эскалации, поэтому в мире 1с этот флаг трассировки ms sql полезен
10. redfred 17.09.23 16:30 Сейчас в теме
(9)
Затем что эскалация страничной блокировки достаточно часто я является проблемой.


Но ведь блокировки на уровне строк тоже эскалируются. Какая разница, по сути?
11. a.doroshkevich 1496 17.09.23 16:35 Сейчас в теме
(10) нет, они давно выключены, 1с отправляет этот флаг в ms SQL, этот тип эскалации происходит на уровне сервера 1с и соответственно система об этом в курсе
А страничная эскалация идет на более низком уровне
12. redfred 18.09.23 09:15 Сейчас в теме
(11) Разве есть отдельные флаги для отключения разных уровней эскалации блокировок? Вроде их всего два было - один для отключения триггера экскалации по количеству локов, второй - по занимаемой локами памяти, но, емнип, там без всякого различия страничные это локи или на строках. Или речь о чем-то другом?
13. a.doroshkevich 1496 18.09.23 09:45 Сейчас в теме
(12)Извиняюсь, некорректно выразился
Флага отдельного действительно нет
Но платформа берёт управление блокировками строк на себя. в том числе и эскалацию при достижении 100 000 строк (в MS SQL этот порог 10 000 насколько я помню)
А вот страничную эскалацию платформа на себя взять не может, так как только субд знает как данные в страницах лежат
В итоге получаем неприятные моменты блокировок и таймаутов
14. redfred 18.09.23 10:11 Сейчас в теме
15. starik-2005 3087 18.09.23 10:31 Сейчас в теме
22-й платформе сто лет в обед, а тут всплывает внеочередной раз юзер, который увидел в логе скула ошибок и пошел гуглить, и результаты гугления на инфостарт постить. Не, ну а чо...
19. ITEkb 21.09.23 06:48 Сейчас в теме
(15) Не все живут на Инфостарте, переход на последние версии далеко не многие практикуют.
Только когда конфигурации вынудят.
Количество комментаторов тоже говорит об актуальности темы.
У меня тема решена, но все же зашел еще раз убедиться в правильности выбранного решения.
И за ссылку на Brent Ozar отдельная благодарность.
oneworker; +1 Ответить
20. andrew.ab 220 26.09.23 13:00 Сейчас в теме
Еще один из вариантов скрипта.
Прикрепленные файлы:
SQLQuery_Rebuild_Reindex_8.3.22.xx.sql
user926893; jawakharlal; +2 Ответить
21. user1884051 28.09.23 15:27 Сейчас в теме
Подскажите пожалуйста. Правильно ли понимаю что дефрагментация = реорганизация? Что в 8.3.22 перестала работать именно реорганизация, а перестроение индекса срабатывает нормально? У себя проверил - реорганизация не выполнилась, но перестроение выполняется.
И если с перестроением индекса проблем нет, то обязательно ли делать реорганизацию? Допустим, настроена ежедневная реорганизация, которая перестала выполняться и еженедельное перестроение индекса. Возможно допустимо оставить только перестроение? Последнее, кстати, в моем случае, выполняется достаточно быстро.
23. human_new 694 06.10.23 13:12 Сейчас в теме
(21) Хорошо, что у вас успевает выполняться перестроение. Да, по факту база будет работать и вообще без скриптов. Перестроеяния конечно будет достаточно. Тут больше вопрос нюансов производительности и на практике их проверить довольно сложно, от этого и нет четких ответов.
user1884051; +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

решает вроде бы проблему, но не на всех базах данных.
_______________________________
Буду рад помощи
Оставьте свое сообщение