Имя: Пароль:
1C
1C 7.7
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
:-)
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший