При работе с модулем EDI от контур, база 1с версия SQL начинает сильно виснуть.

БАЗА (53 гб)

ВНИМАНИЕ! Уважаемые гости сайта, это статья написана для собственных нужд, чтобы не потерять алгоритм действий, которые решают нашу проблему! Не гарантируем, что алгоритм поможет Вашей проблеме, перед выполнением обязательно сделать полный бэкап! Все выполненные действия остаются на Вашей совести!

Данный алгоритм собран из открытых источников и профильных форумов, не претендует ни на что. «MyBase» нужно изменить на имя вашей базы

1.   Сделать полный Backup!

2.  Выполняем скрипт. Он переводит базу в монопольный режим, проверяет и восстанавливает базу без потери данных (параметр REPAIR_REBUILD), скрипт можно(нужно) запустить несколько раз. (Для примера первый раз наша база проверялась/исправлялась 2 часа, второй раз 30 минут, третий и четвертый раз по 20. Дальше не стал.)

Use «MyBase»
GO
ALTER DATABASE «MyBase» SET SINGLE_USER
GO
DBCC CHECKDB(‘MyBase’, REPAIR_REBUILD)
GO

3. Cжать\очистить системную базу tempdb, достаточно перезапустить службу SQL

4. Выполнить скрипт, случайно на него забрел в англоязычном интернете, на сколько я понял он находит потерянные индексы и генерирует скрипт, который восстанавливает эти «потеряшки» .

SELECT
migs.avg_total_user_cost * (migs.avg_user_impact / 100.0) * (migs.user_seeks + migs.user_scans) AS improvement_measure,
‘CREATE INDEX [missing_index_’ + CONVERT (VARCHAR, mig.index_group_handle) + ‘_’ + CONVERT (VARCHAR, mid.index_handle)
+ ‘_’ + LEFT (PARSENAME(mid.statement, 1), 32) + ‘]’
+ ‘ ON ‘ + mid.statement
+ ‘ (‘ + ISNULL (mid.equality_columns,»)
+ CASE WHEN mid.equality_columns IS NOT NULL AND mid.inequality_columns IS NOT NULL THEN ‘,’ ELSE » END
+ ISNULL (mid.inequality_columns, »)
+ ‘)’
+ ISNULL (‘ INCLUDE (‘ + mid.included_columns + ‘)’, ») AS create_index_statement,
migs.*, mid.database_id, mid.[object_id]
FROM sys.dm_db_missing_index_groups mig
INNER JOIN sys.dm_db_missing_index_group_stats migs ON migs.group_handle = mig.index_group_handle
INNER JOIN sys.dm_db_missing_index_details mid ON mig.index_handle = mid.index_handle
WHERE migs.avg_total_user_cost * (migs.avg_user_impact / 100.0) * (migs.user_seeks + migs.user_scans) > 10 AND mid.database_ID = Db_id(‘MY BASE‘)
ORDER BY migs.avg_total_user_cost * migs.avg_user_impact * (migs.user_seeks + migs.user_scans) DESC

5.  Если запрос был не пустым, во втором столбце сгенерирован скрипт который надо выполнить. Можно выделить весь столбец нажав на заголовок столбца (1 на фото) и скопировать скрипт (правкой кнопкой на выделенные ячейки, копировать. 2 на фото) и выполнит скопированный скрипт восстановления потерянных индексов.

Зависает 1с при работе с EDI , SQL

В последний раз у меня было 32 потерянных индекса. Восстановил минуты за 3. После повторного выполнения поиска потерянных индексов запрос вернулся пустым. По наблюдениям этот скрипт помог с проблемой.

5. Вернуть базу в многопользовательский режим

ALTER DATABASE «MyBase» SET MULTI_USER

 

Рад услышать Ваше мнение, помогло / не помогло, может что добавить можно. Спасибо!

Leave a Comment