|
Реиндексация 1С 8.3 на SQL | ☑ | ||
---|---|---|---|---|
0
Bkmzat
12.02.19
✎
11:25
|
Добрый день.
Исходные данные: 1. 1с база размером боле 500 Гб на баз MS SQL 2012 2. Кол-во одновременно работающих круглосуточно пользователей - от 200 до 450. 3. Ресурсы сервера на котором лежит база: Xeon-E5*2 Оперативная память LRDIMM 256 ГБ Жёсткий диск - M2 - 2 Tb Задание: Раз в неделю запускается регламентное задание по реиндексации базы, но к сожалению постоянно, на разных этапах задание вываливается в ошибки: "-1073548784" с сообщением об ошибке "Сбой выполнения запроса "sp_msforeachtable N'DBCC DBREINDEX (''?'')'" со следующей ошибкой: "Транзакция (идентификатор процесса 122) вызвала взаимоблокировку ресурсов блокировка с другим процессом и стала жертвой взаимоблокировки. Запустите транзакцию повторно." "-1073548784" с сообщением об ошибке "Сбой выполнения запроса "ALTER INDEX [_AccumRg14146_ByDims14584_TR] ON [dbo..." со следующей ошибкой: "Транзакция (идентификатор процесса 104) вызвала взаимоблокировку ресурсов блокировка с другим процессом и стала жертвой взаимоблокировки. Запустите транзакцию повторно.". Возможные причины сбоя: проблемы с этим запросом, свойство "ResultSet" установлено неправильно, параметры установлены неправильно или соединение было установлено неправильно." Для примера даны две ошики двух задач (первая ошибка задачи реиндексации командой "sp_msforeachtable N'DBCC DBREINDEX (''?'')'" , вторая ошибка задачи реиндексация стандарная "Задача перестроение индекса"" которая формируется автоматом) И так далее в разных таблицах разные идентификаторы процесса Вопрос: Что можно предпринять для того, чтобы все же реиндексация проводилась? Пользователей выгонять на время реиндексации нельзя. |
|||
1
timurhv
12.02.19
✎
11:39
|
(0) Вы скрипт писали или стандартный MSSQL используете? Редакция какая у SQL?
|
|||
2
los_hooliganos
12.02.19
✎
11:41
|
"Что можно предпринять для того, чтобы все же реиндексация проводилась?"
Делать рукамии раз это 24*7 Перед реиндексом онлайн проанализировать все индексы на типы, что онлайн возможен |
|||
3
Bkmzat
12.02.19
✎
11:45
|
(1) Ну как я понимаю команда "sp_msforeachtable N'DBCC DBREINDEX (''?'')'" это по сути скрипт. Делал и командой и стандартный Т-SQL. Редакция у SQL - Microsoft SQL Server 2012 (SP4) (KB4018073) - 11.0.7001.0 (X64)
|
|||
4
Bkmzat
12.02.19
✎
11:47
|
(2) Руками 1С-ника или руками sql-ника?
|
|||
5
Йохохо
12.02.19
✎
11:51
|
дбцц дбреиндекс депрекейтед вроде и про него явно написано что он оффлайновый. то есть минимум надо все переделать на альтер индекс
|
|||
6
ptiz
12.02.19
✎
11:55
|
(0) Мы используем реиндекс отсюда:
http://www.gilev.ru/dbreindex/ |
|||
7
timurhv
12.02.19
✎
11:59
|
(6) ONLINE=ON доступен не во всех редакциях
|
|||
8
ptiz
12.02.19
✎
12:01
|
(7) Поэтому у нас OFF :)
|
|||
9
Bkmzat
13.02.19
✎
15:12
|
(6) Ни один скрипт из этой темы у меня не запустился, а в скриптах я не силён. Если можете сказать что заменить там в скриптах чтобы заработало, то буду рад.
|
|||
10
Мыш
13.02.19
✎
15:13
|
(9) При такой постановке вопроса радость не скоро посетит тебя.
|
|||
11
ptiz
13.02.19
✎
15:17
|
(9) Вот. Скопировал из нашей базы. Только MYDB поменяй на имя базы.
use MYDB go declare @minRows int set @minRows = 10000 declare @reindexQuery nvarchar(max) set @reindexQuery = REPLACE(REPLACE( cast( ( select 'BEGIN TRY ALTER INDEX '+idx.name+' ON '+ sc.name+'.'+ t.name+ CASE WHEN st.avg_fragmentation_in_percent > 30 THEN ' REBUILD WITH (ONLINE=OFF) END TRY BEGIN CATCH ALTER INDEX '+idx.name+' ON '+ sc.name+'.'+ t.name+ ' REBUILD WITH (ONLINE=OFF) END CATCH;' ELSE ' REORGANIZE END TRY BEGIN CATCH END CATCH;' END as query from sys.dm_db_index_physical_stats( DB_ID(),NULL,NULL,NULL,NULL) st join sys.tables t on (st.object_id=t.object_id) join sys.schemas sc on (sc.schema_id=t.schema_id) join sys.indexes idx on (t.object_id=idx.object_id and st.index_id=idx.index_id) join sys.partitions p on (p.index_id=idx.index_id and p.object_id=idx.object_id) where p.rows > @minRows and st.avg_fragmentation_in_percent > 30 order by st.avg_fragmentation_in_percent desc FOR XML PATH(''), TYPE ) as nvarchar(max)) ,'</query>','; '),'<query>','') print @reindexQuery exec (@reindexQuery) |
|||
12
Bkmzat
13.02.19
✎
16:36
|
(11) Спасибо, попробую, в пятницу отпишусь.
|
|||
13
Bkmzat
18.02.19
✎
08:20
|
Добрый день. Все вроде работает. Спасибо за помощь.
|
|||
14
Ivan5
16.03.19
✎
17:08
|
Привет всем, подскажите пожалуйста поконкретнее где нужно поменять в строчки коде.
"Только MYDB поменяй на имя базы. use MYDB go " Я просто с MSSQL на вы, а проблема точно такая же. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |