|   |   | 
| 
 | v7: SQL тормозит на запросах к регистрам. | ☑ | ||
|---|---|---|---|---|
| 0
    
        mvk 09.03.16✎ 11:36 | 
        Добрый день. 
 1С 7.7.27 + SQL2008 Enterprise + 1С++. Самописная конфа. При перепроведении документов за несколько месяцев через "Операции"-"Проведение документов..." (движок и каталог с md локально на SQL) тормоза нарастают с 4-5 часов/месяц до 8-10 часов/месяц. Помогает прерывание проведения и переиндексация таблиц итогов регистров (RG...) средствами SQL. Оперативной памяти достаточно (более 100 гиг под SQL при базе в 48 гиг). Модель восстановления простая, уровень совместимости SQL2000, автообновление статистики отключено. Похоже, что переполняется какой-то буфер в SQL. Подскажите, плиз, как отловить? | |||
| 1
    
        Cyberhawk 09.03.16✎ 11:37 | 
        Может в сторону ТА?     | |||
| 2
    
        mvk 09.03.16✎ 11:38 | 
        Если я правильно понимаю, то при переиндексации чистится то, что переполнено. Потому и помогает. Что это может быть?     | |||
| 3
    
        mvk 09.03.16✎ 11:39 | 
        Переповедение этим способом подразумевает, что все проводится на ТА.     | |||
| 4
    
        mvk 09.03.16✎ 11:41 | 
        Может подскажете, какие счетчики поставить анализироваться в средствах наблюдения?     | |||
| 5
    
        Z1 09.03.16✎ 11:44 | 
        (0) Похоже статистика не обновляется.
 уровень совместимости надо ставить 110 а то не факт что если движок 2008 а база 80 то вполне возможно что известная ошибка которая под sql2000, в твоей базе точно также проявляется. | |||
| 6
    
        Ёпрст гуру 09.03.16✎ 11:46 | 
        >>>уровень совместимости SQL2000,
 вот это исправь, сперва | |||
| 7
    
        mvk 09.03.16✎ 11:58 | 
        Статистика обновляется по расписанию. Уровень повышу, но сдается мне - не то. Почему переиндексация помогает?     | |||
| 8
    
        Ёпрст гуру 09.03.16✎ 12:09 | 
        как дружил с 2008 ?     | |||
| 9
    
        mvk 09.03.16✎ 12:32 | 
        Секретный релиз http://catalog.mista.ru/public/82018/     | |||
| 10
    
        Ёпрст гуру 09.03.16✎ 12:54 | 
        ну , тогда (6), для начала и в 2008 нет проблемы , как в 2000 , там не надо делать рекконект найтив     | |||
| 11
    
        Ёпрст гуру 09.03.16✎ 12:55 | 
        и, надеюсь, все dll -ки родные, от 2008 скуля ? Всякие одбс от старого не переписывал, поверх ?     | |||
| 12
    
        mvk 09.03.16✎ 12:58 | 
        Родные, конечно. В 2008 нет проблемы реконнекта в любом уровне совместимости базы.     | |||
| 13
    
        Ёпрст гуру 09.03.16✎ 13:01 | 
        ну ладно, авторасширение, какое установлено ?
 тепмпдб, где валяется ? | |||
| 14
    
        Ёпрст гуру 09.03.16✎ 13:02 | 
        с 4-5 часов/месяц.. это конечна жесть, у нас база за ночь за год перепроводилась, порядка полмульта доков     | |||
| 15
    
        Ёпрст гуру 09.03.16✎ 13:03 | 
        мот тупо есть кучка незакрытых регистров ? Туда посмотреть в начале ? Или доки с 1980 года, от которых итоги каждый раз из периода в период едут ?     | |||
| 16
    
        Ёпрст гуру 09.03.16✎ 13:04 | 
        Или.. проверить сперва пустые даты в _1sjourn/_1soper/_1scentry ..это те, которые 1573 годом     | |||
| 17
    
        Ёпрст гуру 09.03.16✎ 13:06 | 
        И это, нет ли строковых измерений, с типом строка хрензнает какая длина ? ...     | |||
| 18
    
        mvk 09.03.16✎ 13:07 | 
        темп на отдельном ссд, авторасширение 200 метров база и 100 метров лог. База с 2002 года. Основная нагрузка на последние годы, само собой. Примерно 6000-7000 доков в день. Проблема в том, что ОДИН И ТОТ ЖЕ ПЕРИОД в одном случае проводится 4 часа, в другом - 8. База только на регистрах. Пустых дат нет.     | |||
| 19
    
        mvk 09.03.16✎ 13:07 | 
        Так что плевать пока на структуру регистров и т.п. Дело чисто в SQL.     | |||
| 20
    
        mvk 09.03.16✎ 13:08 | 
        Замер отладчика показывает резкое торможение на запросах к регистрам (виртуальные таблицы 1С++)     | |||
| 21
    
        mvk 09.03.16✎ 13:09 | 
        Допустим, в одном случае 1000 запросов выполняется за 80 секунд, а в другом этот же период 1000 запросов за 1000 секунд.     | |||
| 22
    
        mvk 09.03.16✎ 13:10 | 
        При этом сервер и база использовались монопольно. Напомню, что помогала переиндексация RG...     | |||
| 23
    
        Ёпрст гуру 09.03.16✎ 13:14 | 
        А если обновить статистику, без пересчета итогов, помогает хоть ?     | |||
| 24
    
        ADirks 09.03.16✎ 13:15 | 
        я бы ещё попробовал периодически сбрасывать кэш планов
 DBCC FREEPROCCACHE в монопольном режиме гемор конечно... | |||
| 25
    
        mvk 09.03.16✎ 13:19 | 
        (23) Нет, статистика не помогает.
 (24) Пробовал, не то, хотя примерно нечто такое я и ищу. Какими бы счетчиками производительности обвешаться? | |||
| 26
    
        trad 09.03.16✎ 13:21 | 
        (16) 1753     | |||
| 27
    
        trad 09.03.16✎ 13:23 | 
        установить
 max degree of parallelism = 1 | |||
| 28
    
        mvk 09.03.16✎ 13:26 | 
        (26) Все равно нету )))
 (27) Ну не то это. Переполняется какая-то дрянь. | |||
| 29
    
        ADirks 09.03.16✎ 13:29 | 
        ну самое стандартное:
 SELECT TOP 10 [Wait type] = wait_type, [Wait time (s)] = wait_time_ms / 1000, [% waiting] = CONVERT(DECIMAL(12,2), wait_time_ms * 100.0 / SUM(wait_time_ms) OVER()) FROM sys.dm_os_wait_stats WHERE wait_type NOT LIKE '%SLEEP%' and wait_type not like '%backup%' and wait_type Not IN ('REQUEST_FOR_DEADLOCK_SEARCH', 'XE_TIMER_EVENT', 'FT_IFTS_SCHEDULER_IDLE_WAIT', 'XE_DISPATCHER_WAIT', 'LOGMGR_QUEUE', 'CHECKPOINT_QUEUE', 'BROKER_TO_FLUSH' ) ORDER BY wait_time_ms DESC может с ходу чего-нить показать... а может и нет :) ещё вот такая полезная штука есть: http://simplesqlserver.com/2013/08/13/sys-dm_os_perfomance_counters-demystified/ | |||
| 30
    
        mvk 09.03.16✎ 13:37 | 
        Хм. А vk_Hook1C.dll не дружит с уровнем базы 110. Ладно, обойдусь без нее.     | |||
| 31
    
        ADirks 09.03.16✎ 13:38 | 
        и ещё, статейка:  https://blogs.msdn.microsoft.com/blogdoezequiel/2014/04/09/sql-swiss-army-knife-14-troubleshooting-with-waits-and-latches/
 там в самом начале ссылочка на скрипт view_Waits.sql | |||
| 32
    
        mvk 09.03.16✎ 13:39 | 
        ASYNC_IO_COMPLETION    71419    30.80
 LCK_M_S 36595 15.78 LCK_M_U 32060 13.83 ASYNC_NETWORK_IO 31477 13.58 WRITELOG 26175 11.29 PAGEIOLATCH_SH 9094 3.92 LCK_M_X 7416 3.20 PAGEIOLATCH_EX 3269 1.41 LCK_M_IX 2888 1.25 PAGELATCH_EX 2708 1.17 | |||
| 33
    
        Ёпрст гуру 09.03.16✎ 13:39 | 
        (30) это вообще надо в первую очередь выкинуть.. зачем вы вообще её используете ? не понимаю.     | |||
| 34
    
        mvk 09.03.16✎ 13:39 | 
        (33) )) Уже выкинул     | |||
| 35
    
        trad 09.03.16✎ 14:06 | 
        "Замер отладчика показывает резкое торможение на запросах к регистрам (виртуальные таблицы 1С++)"
 Есть возможность получить план запроса для резко заторможенных запросов? Думаю, все же, не стоит отметать вероятность неудачного выбора плана запроса и зацикливаться на поиске кешей/буферов | |||
| 36
    
        mvk 09.03.16✎ 14:18 | 
        Зарядил копию проводиться. К вечеру начнет тормозить, тогда увижу. Я бы понял неудачный выбор, если бы статистика обновлялась. А так... Но данные соберу. И счетчики включу. Когда начнет тормозить.     | |||
| 37
    
        ЧеловекДуши 09.03.16✎ 14:23 | 
        (36) Помнится, 1С 7.7 всегда славилась тормозами при проведении очень большого пакета документов зв один "чих" :)     | |||
| 38
    
        Злопчинский 09.03.16✎ 14:26 | 
        (37) ну, если все впихнуть в одну транзакцию...     | |||
| 39
    
        trad 09.03.16✎ 14:32 | 
        (37) это замедление было только на sql2000 и при определенных условиях     | |||
| 40
    
        Злопчинский 09.03.16✎ 14:36 | 
        (39) ну не знаю... длительное восстановление ГП всегда было проще прервать и запустить заново с продолжением. Получалось быстрее. Видимо восстановление ГП всегда попадало под "определенные условия"     | |||
| 41
    
        mvk 09.03.16✎ 14:41 | 
        Historical_Latches    BUFFER    16886.92    113833183    99.98    99.98    0.0001    [Buffer Pool - PAGELATCH or PAGEIOLATCH]
 Historical_Latches ALLOC_IAM_PAGE_RANGE_CACHE 1.05 6 0.01 0.01 0.1742 Other Historical_Latches FGCB_ADD_REMOVE 0.84 29 0.00 0.01 0.0291 [IO Operations] Historical_Latches LOG_MANAGER 0.73 8 0.00 0.02 0.0916 [IO - Log] Historical_Latches ACCESS_METHODS_HOBT_COUNT 0.32 4792 0.00 0.01 0.0001 [HoBT - Metadata] Historical_Latches BUFFER_POOL_GROW 0.08 178 0.00 0.00 0.0004 Other Historical_Latches ACCESS_METHODS_HOBT_VIRTUAL_ROOT 0.03 147 0.00 0.00 0.0002 [HoBT - Metadata] Historical_Latches QUERY_OPTIMIZER_ID_MANAGER 0.03 1448 0.00 0.00 0.0000 Other | |||
| 42
    
        mvk 09.03.16✎ 14:42 | 
        Information    latch_class    wait_time_s    waiting_requests_count    pct    overall_running_pct    avg_wait_s    latch_category     | |||
| 43
    
        mvk 09.03.16✎ 14:43 | 
        Что-то первая строчка меня беспокоит. Это запрос отсюда:
 https://blogs.msdn.microsoft.com/blogdoezequiel/2014/04/09/sql-swiss-army-knife-14-troubleshooting-with-waits-and-latches/ | |||
| 44
    
        trad 09.03.16✎ 14:44 | 
        (40) восстановление ГП с применением типовых методов проведения - да, попадало     | |||
| 45
    
        trad 09.03.16✎ 14:46 | 
        (44) + но это в данной ветке, пока - оффтопик     | |||
| 46
    
        mvk 09.03.16✎ 14:46 | 
        Попадало, потому что регистры приходится очищать и пересчитывать, которые еще впереди. Я реистры чищу перед перепроведением. Получается в разы быстрее.     | |||
| 47
    
        trad 09.03.16✎ 14:49 | 
        (46) Замедление проведения на 2000 связано с применением множественных фильтров, например при расчете остатков.
 Если избавиться от множественных фильтров, то замедления не будет и реконектнейтив не понадобится | |||
| 48
    
        toypaul гуру 09.03.16✎ 14:54 | 
        не знаю для 2008 актуально это или нет, на 2000 скл была системная проблема с замедлением из-за частого создания временных таблиц.
 у меня в оптимизации для ТиС была для этого предусмотрена глобальная временная таблица | |||
| 49
    
        mvk 09.03.16✎ 14:59 | 
        Если кому интересно, я перепровожу большие базы на копии, а потом внедряю регистры в оригинал. Разумеется с запретом редактирования документов. Накидал свое и не свое:
 https://dropmefiles.com/1wS2y 1. Запрет редактирования документов ранее, скажем, 01.03.16 2. Бэкап. 3. Восставить из бэкапа в копию. (и MD и т.п. тоже) 4. Убить регистры в копии скриптом. 5. Перепровести копию до 01.03.16. 6. Бэкап. 7. Внедрить в оригинал регистры перепроведенной копии скриптом. 8. Перепровести остаток оригинала. 9. Открыть доступ к докам. | |||
| 50
    
        mvk 09.03.16✎ 15:04 | 
        Таким образом даже очень тяжелые базы уйдут в монопольный доступ только на время внедрения регистров и проведения хвостика. 
 СКРИПТЫ ПИСАЛИСЬ ТОЛЬКО ПОД РЕГИСТРЫ. ПРОВОДКИ НЕ ПЕРЕНОСЯТСЯ!!! | |||
| 51
    
        ADirks 09.03.16✎ 15:06 | 
        Кстати, после всяких бэкапов/ресторов, и прочих регламентов типа перестроения индексов и статистик, надо счетчики сбрасывать, а то фигня будет, а не статистика.
 DBCC SQLPERF('sys.dm_os_wait_stats', CLEAR) DBCC SQLPERF(''sys.dm_os_latch_stats'', CLEAR) | |||
| 52
    
        mvk 09.03.16✎ 15:07 | 
        (51) Попробую, спс.     | |||
| 53
    
        mvk 22.03.16✎ 12:46 | 
        Похоже, что дело было в статистике индексов, которая, в силу проведения кучи документов из одного периода, настраивалась на текущий месяц. И когда начинали проводиться документы следующего месяца, система тормозила. Вылечил созданием служебного документа, который поместил в начало каждого месяца. В модуле документа перестраиваю индексы таблиц итогов регистров с целью сброса статистики и реорганизации (дефрагментации) индексов и сбрасываю кэш:
 Процедура ОбработкаПроведения() Запрос = СоздатьОбъект("ODBCRecordSet"); ТекстЗапроса = " |SET NOCOUNT ON | |DECLARE @SQL NVARCHAR(900) |DECLARE @TableName char(32) |DECLARE SysCur CURSOR FOR SELECT name FROM sysobjects WHERE type='U' and name like 'RG%' order by name |OPEN SysCur |FETCH NEXT FROM SysCur INTO @TableName |WHILE @@FETCH_STATUS=0 BEGIN | SET @SQL = N'ALTER INDEX ALL ON dbo.' + @TableName + N' REBUILD WITH (SORT_IN_TEMPDB = ON, ONLINE = ON)' | EXECUTE sp_executesql @SQL | FETCH NEXT FROM SysCur INTO @TableName |END |CLOSE SysCur |DEALLOCATE SysCur | |DBCC FREEPROCCACHE |"; Попытка Запрос.ВыполнитьСкалярный(ТекстЗапроса); Исключение КонецПопытки; КонецПроцедуры Такое перестроение возможно, только если SQL Enterprise. Имеется ввиду хинт "ONLINE = ON". На рабочей базе с кучкой активных пользователей документ провелся за 12 минут. Проведение копии за последние 9 месяцев не тормозило. Стабильные 3-4 часа/месяц. | |||
| 54
    
        mvk 22.03.16✎ 12:49 | 
        Выполнение только (51) не помогло.     | |||
| 55
    
        Ёпрст гуру 22.03.16✎ 12:52 | 
        (53) как то не кошерный код, а если баз много ? И они еще и разные ?     | |||
| 56
    
        mvk 22.03.16✎ 12:53 | 
        Я под себя писал. Идею донес, а там допиливайте под себя ))
 А что не кошерного? Что смущает? | |||
| 57
    
        Ёпрст гуру 22.03.16✎ 12:55 | 
        (56) вот это
 SELECT name FROM sysobjects WHERE type='U' and name like 'RG%' | |||
| 58
    
        mvk 22.03.16✎ 12:57 | 
        Это модуль проведения документа, который находится в началах периодов. Нужен для перепроводки конкретной базы. Так что "баз много" - надо в каждую вставить. На счет разных баз, можно дописать под бухгалтерию, добавив обработку таблицы _1scttlc, кажется.     | |||
| 59
    
        mvk 22.03.16✎ 12:58 | 
        (57) а как лучше?     | |||
| 60
    
        Ёпрст гуру 22.03.16✎ 13:00 | 
        (59) как минимум, добавить в запрос условие на конкретную базу.
 Если несколько баз на серваке, (и не только от 7.7) он же тебе все их будет колбасить | |||
| 61
    
        mvk 22.03.16✎ 13:03 | 
        Не будет. Он же в контексте конкретной базы выполняется.     | |||
| 62
    
        mvk 22.03.16✎ 13:04 | 
        И у меня, кстати, несколько баз. Копия для программирования, как минимум. ))     | |||
| 63
    
        Ёпрст гуру 22.03.16✎ 13:04 | 
        (61) ?     | |||
| 64
    
        Mikeware 22.03.16✎ 13:04 | 
        (61) а причем тут контекст? ты ж явно лезешь к сисобджектс...     | |||
| 65
    
        mvk 22.03.16✎ 13:06 | 
        Выполни
 select COUNT(*) from sysobjects в Management Studio для разных баз. | |||
| 66
    
        mvk 22.03.16✎ 13:08 | 
        Если это представление содержит сведения обо ВСЕХ базах, то результат будет одинаковый. А если только о текущей базе - то разный. У меня разный результат получился.     | |||
| 67
    
        Ёпрст гуру 22.03.16✎ 13:13 | 
        (66)ну, может быть, лень смотреть даже :)     | |||
| 68
    
        mvk 22.03.16✎ 13:17 | 
        :)
 В обозревателе объектов: "Базы данных"-"Моя база"-"Представления"-"Системные представления"-... Там все эти служебные вьюшки лежат. Для каждой базы свои. | |||
| 69
    
        mvk 22.03.16✎ 13:23 | 
        Кстати, Мишаня! Поздравляю с присоединением к лиге трехкратных отцов! ))) Сам уже 3,5 года как такой )))     | |||
| 70
    
        Mikeware 22.03.16✎ 13:31 | 
        это ты кому?     | |||
| 71
    
        mvk 22.03.16✎ 13:52 | 
        Тебе! ))) Тут Мишани только ты да я )))     | |||
| 72
    
        Mikeware 22.03.16✎ 13:55 | 
        (71) ну, по крайней мере мне об этом ничего не известно. 
 Я понимаю, что "ни один мужчина не может быть уверен в количестве своих детей"©, но вряд ли за последние несколько лет что-то существенно измениллось... | |||
| 73
    
        mvk 22.03.16✎ 13:57 | 
        тогда извиняй ))) Мне на днях ветка попадалась, видимо обознался )     | |||
| 74
    
        mvk 22.03.16✎ 13:57 | 
        Точно! Это Кулешов Мишка был!     | |||
| 75
    
        Mikeware 22.03.16✎ 14:00 | 
        :-)     | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |