Имя: Пароль:
1C
1С v8
Реиндексация 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 на вы, а проблема точно такая же.