Урсалов Константин

48
Рейтинг

kursaloff
Константин Урсалов



  •   Регистрация: 15.09.2010 (13 лет назад)

  •   Был(а) на сайте: 18.04.2017

Подписчики 3

Рейтинг 48

Создание недостающих индексов в MSSQL

Инструменты и обработки Системный администратор Программист Платформа 1С v8.3 Конфигурации 1cv8 Россия Абонемент ($m) Архив с данными HighLoad оптимизация

Для тех, кто борется с производительностью 1С8. MSSQL сервер оказывается накапливает статистику о недостающих индексах и есть возможность получить скрипты по их созданию

1 стартмани

17.05.2012    24321    204    kursaloff    19       

48

Комментарии

HighLoadОпределение размера базы данных 1С с разбивкой по объектам метаданных#14 05.06.12 14:50
Для информации - мой вариант запроса по размерам таблицы.
1) Была проблема когда параллельно выгружаешь данные из нескольких баз а временная таблица одна. Для каждой базы нужно создавать таблицу со своим имененм. Переменная должна быть инициализирована выше.
2) Добавил перед началом удаление таблицы если она существует.
3) Если по каким то причинам запрос вылетает (у меня иногда бывает, когда запускаешь в консоли - конфликты блокировок, сделал так чтобы команда выполнялась 30 раз в цикле, если возникает какая то проблема.


Код
   ШаблонЗапросаУдаления="if exists (select * from tempdb.dbo.sysobjects where id = object_id('tempdb..[#t_"+ИмяБазыДанных+"]') ) drop table #t_"+ИмяБазыДанных+";";    
   ШаблонЗапроса =   "
   |SET NOCOUNT ON;
   |declare @sucess int;
   |declare @count int;
   |set @sucess=0;
   |set @count=0;
   |WHILE @sucess = 0 and  @count<30 
   |BEGIN
   |   BEGIN TRY    
   |      BEGIN TRANSACTION;
   |      "+ШаблонЗапросаУдаления+"
   |      CREATE TABLE #t_"+ИмяБазыДанных+"([Name] varchar(255), [TableRows] varchar(255), [SizeReserved] varchar(255), [DataSize] varchar(255), [IndexSize] varchar(255), [Unused] varchar(255));
   |      INSERT INTO #t_"+ИмяБазыДанных+"
   |      exec  sp_spaceused N'%ИмяТаблицы%','true';
   |      SELECT * FROM #t_"+ИмяБазыДанных+" ORDER BY CONVERT(bigint, REPLACE([SizeReserved], ' KB', '')) DESC;
   |      "+ШаблонЗапросаУдаления+"  
   |      set @sucess=1;
   |      COMMIT TRANSACTION;
   |   END TRY 
   |      BEGIN CATCH 
   |         set @count=@count+1;
   |         WAITFOR DELAY '00:00:05';
   |      END CATCH 
   |END ";

HighLoadОпределение размера базы данных 1С с разбивкой по объектам метаданных#13 05.06.12 14:45
Урааа!!!!!!! Две недели бился :)
кажется решил проблему с таймаутом и ошибкой Текущий поставщик не поддерживает возврат нескольких наборов записей в результате

попробуйте изменить следующее:
RS = Новый COMОбъект("ADODB.Recordset");
cmd = Новый COMОбъект("ADODB.Command");
cmd.ActiveConnection = Connect;
cmd.CommandText = СтрЗаменить(ШаблонЗапроса,"%ИмяТаблицы%",Строка.ТаблицаSQL);

//Добавляем информацию о тамймауте.
cmd.CommandTimeout=360;

Попытка

//при вызове рекодсета так - он не использует настройки таймаута.
//RS.Open(СтрЗаменить(ШаблонЗапроса,"%ИмяТаблицы%",Строка.ТаблицаSQL), Connect);

//Вызываем рекордсет через RS=cmd.Execute(); RS=cmd.Execute();
Исключение
Сообщить(ОписаниеОшибки());
Сообщить("------------------");
сообщить(СтрЗаменить(ШаблонЗапроса,"%ИмяТаблицы%",Строка.ТаблицаSQL));
КонецПопытки;
HighLoadСоздание недостающих индексов в MSSQL#15 01.06.12 21:34
(14) Munsera, что то слишком долго у меня на рег бухгалтерии максимум полчаса индекс создавался. Лучше прервать, посмотреть какой индекс завис и исключить его из скрипта. Я когда создавал индексы выполнял построчно,чтобы видеть какой индекс создается. И еще при создании индексов работа с текущей таблицей лочится
HighLoadОпределение размера базы данных 1С с разбивкой по объектам метаданных#11 01.06.12 11:34
(10) dka80, тоже бьюсь над этой проблеммой .
такая ошибка вылетает иногда причем я заметил только на больших таблицах. И выпадает она именно из за того, что когда выполняется sp_spaceused иногда происходит конфликт блокировок в итоге селект не возвращает ничего и 1С вылетет .

Пытаюсь бороться с этим уже недели и в транзакции запускал и время соединения (таймаут) увеличивал, все равно иногда вылетает.:( :(
Очень обидно так как эту замечательную обработку настроил так чтобы она выгружала информацию о статистике в отдельно стоящую базу, в которой накапливаются данных о наших 15 информационных базах. В итоге наконец то получил общую статистику по размерам. Теперь бы сделать так чтобы сбор статистики работал стабильно, чтобы можно было ее запускать регулярно.

Вопрос к автору. Во первых огромное спасибо за обработку и во вторы можно ли с Вами как то связаться е-майл, телефон, скайп? Может постараемся как то совместно решить данную проблему? Я очень заинтересован в развитии данной обработке и думаю что сделаю следующие дополнительные опции:
1) Выгрузка данных в отдельно стоящее хранилище - простенькая БД с табличками Сервер, БазаДанных, Таблица1С_СКЭЛЬ, ЛогРазмеров на каждую дату.
2) Дополнительно хочу сделать выгрузку по каждой таблице размера индекса и статистике их использования, по аналогии с таблицами получать данные по DM_DB_INDEX_OPERATIONAL_STATS,DM_DB_INDEX_USAGE_STATS, sp_MSindexspace
3) накапливание статистики по рекомендуемым индексам в БД
HighLoadСоздание недостающих индексов в MSSQL#12 29.05.12 18:07
(8) mxm2, сам скрипт выдает только табличку со списком индексов которые нужно создать (ремомендуемые СКУЭЛЬ сервером). Сам процесс создания индексов может занимать довольно продолжительное время и для того чтобы их создать нужно взять результат работы скрипт колонка create_index_if_exists_statement. Просто копи-пастом в новое окно для запроса.
HighLoadСоздание недостающих индексов в MSSQL#11 29.05.12 17:56
(6) squad, совершенно согласен - индексы не панацея и они могут и отрицательно влиять на производительность, да и размер базы если индексы создаются на больших регистрах растут очень сильно. Поэтому к созданию индексов нужно подходить обдуманно, данный скрипт только дает рекомендации
HighLoadСоздание недостающих индексов в MSSQL#5 21.05.12 8:35
дак в этом случае заморачиваться о том слетят или не слетят созданные индексы как раз не нужно - если текст запроса перенести в шедулер, (там проверяется существует индекс или нет) то при удалении индекса он будет создан повторно, если ни одного индекса повторно создавать не нужно, скрпт отработает за секунду.
HighLoadОпределение размера базы данных 1С с разбивкой по объектам метаданных#6 18.05.12 13:22
Пример строки запроса

Тоже вылезала ошибка на RS = RS.NextRecordset(); пока не изменил поставщика на SQL Server Native Client 10.0 - с ней заработала.

Provider=SQLNCLI10.1;Integrated Security=SSPI;Persist Security Info=False;User ID="";Initial Catalog=database_name;Data Source=server-addres;Initial File Name="";Server SPN=""

спасибо за обработку давно искал (+)
HighLoadСоздание недостающих индексов в MSSQL#2 17.05.12 15:33
Хех спасибо за ссылку, может случиться что и велосипед :), если честно обработку не пробовал, но обязательно посмотрю, но...
скрипт не требует запуска 1С. Если на сервере несколько информационных баз отобразится список индексов для всех баз которые рекомендуют создать. Копи пастом результат можно перенести в шедулер, чтобы индексы пересоздавались, если они будут удалены. Вот собственно и все на the best не претендую :)
HighLoadСоздание недостающих индексов в MSSQL#0 16.05.12 12:34
Для тех, кто борется с производительностью 1С8.
MSSQL сервер оказывается накапливает статистику о недостающих индексах и есть возможность получить скрипты по их созданию