v7: Бухгалтерия 7.7: тормоза из-за акта сверки #564649


#0 by DCKiller
Добрый день. Проблема следующая: бехгалтерия 7.7 (sql), в базе одновременно работают 10 пользователей. Как только кто-то из них запускает формирование акта сверки, скажем, за месяц, все остальные начинают жутко тормозить. Как лечится эта проблема? И еще момент. Во время групповой обработки документов частенько вылетает сообщение об ошибке "Время ожидания блокировки таблицы 1SJourn истекло". В принципе, это и так понятно, что таблица журнала доков в момент записи/проведения конкретного документа блокируется для всех остальных юзеров, но - опять же, - вроде бы есть какой-то патч?
#0 by DCKiller
Добрый день. Проблема следующая: бехгалтерия 7.7 (sql), в базе одновременно работают 10 пользователей. Как только кто-то из них запускает формирование акта сверки, скажем, за месяц, все остальные начинают жутко тормозить. Как лечится эта проблема? И еще момент. Во время групповой обработки документов частенько вылетает сообщение об ошибке "Время ожидания блокировки таблицы 1SJourn истекло". В принципе, это и так понятно, что таблица журнала доков в момент записи/проведения конкретного документа блокируется для всех остальных юзеров, но - опять же, - вроде бы есть какой-то патч?
#1 by Naumov
как можно пропатчить фичу?
#2 by andrewks
нагрузку на скулевом серваке мониторил? что за сервак? характеристики? и последний вопрос на пять: какой релиз платформы, и какой скуль?
#3 by AeDen
для первого смотреть надо для второго - посмотри гибкие блокировки от софтпоинта
#4 by DCKiller
2. Восьмиядерный проц, 4 гига оперативы 3. Платформа 27, sql 2000.
#5 by Jaffar
сомневаюсь, что 8 ядер нужны на 4Гб оперативки, но автору виднее. и не понятно, терминальный режим или голая сеть?
#6 by DCKiller
в терминале, ессно...
#7 by yra77
Акт сверки всегда был таким. И на больших базах блокирует таблицы и формируется долго. Выход - искать альтернативный акт сверки или освоить самому прямые запросы. Более НИКАК.
#8 by FN
8 ядер на 10 пользователей? круть. попробуй 1cv7s.exe по ядрам пораскидывать в зависимости от пользователя - должно немного помочь start  /affinity номер_ядра /normal 1cv7s.exe enterprise /DПуть_к_базе
#9 by Jaffar
это не поможет вылечить блокировки.
#10 by DCKiller
А где бы можно глянуть описание полей 1SENTRY?
#11 by Jaffar
в 1cv7.dds :-)
#12 by DCKiller
Ага. А еще в QA :) Меня интересует, в первую очередь, описание содержимого его полей на  ч е л о в е ч е с к о м  языке :)
#13 by leshikkam
Можно переписать акт сверки на Прямые запросы. Если что-обращайся icq 201216890
#14 by DCKiller
Мне нужно просто подробное описание полей 1SENTRY. А переписывать акт сверки под прямые запросы я буду сам.
#15 by DCKiller
+14 усё, нашОль, вопрос снят.
#16 by AeDen
А аккаунтрекордссет использовать религия не позволяет?
#17 by DCKiller
Как получить значение субконто Дт/Кт проводки из 1SENTRY? Про структуру файла можно уже не рассказывать, есличо.
#18 by DCKiller
+17 Пытаюсь выбрать из проводок поле DTSC0, он мне выдает ошибку: State 22018, native 245, message [Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the varchar value '   61H       ' to a column of data type int.
#19 by Кириллка
мож ты к полю Vdtsc0 обращаешься? Код нужно видеть.
#20 by zak555
дело в том, что 1с не использует БухЗапрос
#21 by DCKiller
Лови: SELECT
#22 by Кириллка
на ЭТОМ запросе валится ошибка? Или это уже что-то другое?
#23 by DCKiller
Да, ошибка именно в таком виде. Если убрать Проводки.DTSC0 As СубконтоДт1, то запрос выполняется успешно.
#24 by Креатив
Поищи на Инфоstarte. Я переделывал для УСН, но смысл тот же. Заменил ВыбратьОперации с проводками  на использование бухитогов. Работает в разы быстрее.
#25 by Кириллка
показывай тогда остальной обвес. Ошибки в запросе нет. Или ты не все показываешь!
#26 by DJ Anthon
акт сверки сам по себе тупой. когда-то я его переделывал. сейчас уже не вспомню
#27 by DCKiller
Что еще показать? Весь код процедуры? Мне вот тоже непонятно, почему из-за одной этой строки такая ошибка вываливается. Мож это там в самой таблице в этом поле где глюк какой сидит?
#28 by DCKiller
+27 всё, заработало :-) мой косяк был. В-общем, вариант в рабочий. Теперь возникает вопрос, как это значение привести к типу 1с?
#29 by DCKiller
усё, со всем разобрался вроде бы :-)
#30 by DCKiller
ппц, я в шоке... Вот ведь какая хрень: сделал замер скорости выполнения обычного акта сверки 1С и сделанного на прямом запросе (см. ), с одними и теми же условиями. Так вот что получилось: - время выполнения первого - 8 сек. - время выполнения второго - 98 сек... Прямые запросы меня начинают все больше разочаровывать... :((( Как такое вообще может быть?! Что делать?
#31 by zak555
см. в
#32 by DCKiller
То есть ускорить через прямой запрос эту фигню никак не получится?! :(((((((((((
#33 by Попытка1С
Почитай про класс прямой запрос, там вроде ВТ несколько оптимизированы, да и писать удобнее.
#34 by zak555
хз
#35 by Кириллка
Попросить людей или сделать самому правильно. Чтобы сделать самому правильно, нужно попытаться понять, что ты своим запросом, с большой вероятностью, сканируешь кластерный индекс - отсюда и все проблемы.
#36 by Jaffar
ты жалуешься или хвастаешься? :-)
#37 by DCKiller
Можешь ткнуть в нужном направлении? Как можно оптимизировать запрос из , чтобы он шустрее работал?
#38 by leshikkam
Тебе же уже сказали - использовать виртуальные таблицы
#39 by DCKiller
Где про них можно почитать? Именно про таблицы для 1SEntry
#40 by leshikkam
тебе надо использовать один из классов на базе 1С++ Либо ПрямойЗапрос либо AccountsRecordset
#41 by DCKiller
Интересно... Что такого волшебного в этих классах, что только они позволяют ускорить запрос к таблице проводок?
#42 by DCKiller
Есличо, с классами вообще пока что не работал
#43 by leshikkam
#44 by Дык ё
они попадают в индексы получше, чем ты в . можно и без классов - посмотри на план выполнения и подумай
#45 by DCKiller
Чо за план, как куриццо?
#46 by DCKiller
Это я уже видел. Что там должно мне указать на то, как ускорить мой запрос?
#47 by DCKiller
Вот что нарыл: Там сначала чувак, задающий вопрос, приводит вот такой код без AccountRecordset: Товарищи, т.е. фактически получается, что вариант 2 будет быстрее выполняться по времени по сравнению с вариантом 1?
#48 by Дык ё
это совсем разные запросы, сравнивать время их выполнения не имеет смысла. а так, для эффективной работы варианта 2 в нем не хватает отборов по provkind и active
#49 by Chai Nic
Отбор по _1SENTRY почти всегда будет неоптимальным и тормозным. Акт сверки (обороты в разрезе движений) надо формировать бухзапросом, с отбором по субконто Контрагенты. Причем, по моему опыту - лучше не запускать запрос по всем счетам, а вызвать его несколько раз, по каждому счету, где есть субконто Контрагенты, далее эти данные свернуть в таблице значений. Почему-то несколько бухзапросов по одному счету выполняются значительно быстрее, чем один бухзапрос по списку счетов.
#50 by DCKiller
Имеется в виду стандартный 1совский бухзапрос? Насколько быстрее?
#51 by zak555
если ты не в курсе, можно счета не указывать, а разворачивать по контрам, а потом по счетам смотри в сторону анализ субконто
#52 by Дык ё
это будет тормозить, если по контрам не включен отбор
#53 by Chai Nic
Можно по-разному.. главное не запускать бухзапрос по списку счетов. И не использовать ВыбратьОперацииСПроводками. У нас на бухии изначально был акт сверки жутко тормозным, когда ушли от глобального бухзапроса по всем счетам - сразу стало всё летать, повышение скорости на порядок или на два. sql-версия.
#54 by leshikkam
Товарисчи - есть такой файл который называется Отбор проводок по субконто - _1sbkttl. Так вот именно его а также отбор проводок по счетам и надо использовать
#55 by zak555
нужно нужно смотреть только обороты
#56 by DCKiller
Как в данном случае его использовать?
#57 by Дык ё
это понятно. но без отбора по субконто это выльется в скан таблицы проводок
#58 by bushd
Перепиши акт сверки). Он все равно как был уе..ким так и остался. Памяти мало. SQL жрет дофига, а там еще терминальный сервер. Это ППЦ. Так то вообще изврат, но способ (SQL + TS) вошел прочно в обиход.
#59 by zak555
нет у БИ три таблицы : итоги/остатки/проводки будет по итогам идти
#60 by Дык ё
у тебя уже тяпница? :-) в таблице итогов нет данных о документах-регистраторах движений и таблиц там куда больше трех
#61 by bushd
+58 По момему проще памяти добросить - очевидно что ее мало. Потом написать нормальный акт сверки без всяких прямых запросов - они тут нафиг не нужны... имхо, и не трахать мозг, 10 пользователей всего. Ну любят люди извращаться на ровном месте.
#62 by Сияющий Асинхраль
а можно вопрос не в тему? Зачем бухгалтерскую базу с паршивым десятком пользователей сажать на sql? Терминал плюс dbf будут работать намного быстрее
#63 by Chai Nic
Память не поможет - всё равно последовательный скан это сильно не ускорит.. даже если сервер полностью базу закэширует. Алгоритмы надо переписывать. В типовой алгоритмы под sql не всегда оптимально построены..
#64 by zak555
сколько больше ?
#65 by DCKiller
Затем, что файл проводок уже вырос до нев..бенных размеров, и индексы уже не справляются с нагрузкой.
#66 by DCKiller
"Нормальный" - это какой?
#67 by Chai Nic
Индексы на то и предназначены, чтобы серверу было пофиг на память и быстродействие доступа к ней в первом приближении. Ибо логарифм.
#68 by bushd
Я тут подумал - из за акта может тормозить по одной причине - нехватает памяти. Так что наверное и переписывать ничего не надо. Хотя типовой уродский, писал свои давненько работали гораздо приятнее с использованием бух запроса обычного.
#69 by bushd
+68 Все делал в одном запросе, потом выюборка и все. Код был крайне компактный.
#70 by DCKiller
Стандартный бух. запрос?
#71 by bushd
Почему про память говорю, потмоу что никакие таблицы в акте тут не блокируються... следовательно все упираеться тупо в производитеьность, котороя резко падает если не хватает памяти - ввиду использования под недостающее винта.
#72 by bushd
Да
#73 by bushd
Но я его не на почве производительности писал. Прсто тогда актов вообще не было в типовых))) да было время)
#74 by bushd
+73 Или был совсем убогий
#75 by Chai Nic
В таблице проводок хотя бы десяток мегазаписей есть? :)
#76 by bushd
было наверное, я хрен его знает. Непомню уже.
#77 by bushd
У человека тормозит не акт! Другие юзвери. Так что колбасить атк особого смысла не вижу.
#78 by DCKiller
Ладно, пока всем спасибо. Сегодня уже поздно, завтра буду проверять на работе все варианты. Что получится, отпишусь.
#79 by Chai Nic
Вообще, по моему личному опыту - память менее важна, чем правильные алгоритмы доступа к данным. Попытка загладить косяки памятью ущербна изначально - ибо рано или поздно данных станет больше, и памяти будет опять не хватать.
#80 by bushd
+77 Ну т.е смыс есть но после увеличения памяти. Но вообще я повторюсь SQL + TS это дурдом на мой взгляд. Это уж когда выхода нет. Клиенты дохлые совсем, а в DBF база не влазит.
#81 by bushd
С фига ли ее станет надо больше? Акт формируеться за определнный период по контретному контрагенту. Т.е. ясное дело SQL зажрет еще себе сколько влезет, но к акту никакого отношения это не имеет. Я вот что то думаю, что SQL столбит себе память, терминальные сессиям вероятно приходиться сосать... с диска). Както так. А править алгоритмы в данном конкретном случае тут дело третье. Добавте памяти страждущему. Ведь каждая сессия дофига жрет памяти а тут еще данные обработать надо. 4Гб для SQL + TS - фигово, как впрочем и сама конфигурация дурацкая - SQL + TS.
#82 by Сияющий Асинхраль
согласен. Вопросов нет. Не хочешь поэкспериментировать? У меня в карточке есть ссылка на страничку, на этом адресе лежит несколько эртиков, один из них как раз акт сверки, он в свое время без проблем работал в базе с шестьюдесятью пользователями, а вдруг и у тебя покатит
#83 by bushd
Кстати у меня один и тот же запрос Бух на SQL базе выполняеться в 10-ки раз быстрее чем на DBF. Практика. Правда я терминалы не сажу на SQL сервер)
#84 by Chai Nic
Давать советы типа "добавьте памяти", не видя реального состояния системы, показаний счетчиков производительности в динамике, в часы наибольшей нагрузки и в среднем - по меньшей мере непрофессионально!
#85 by DCKiller
спс, гляну
#86 by bushd
А че тут видеть то? - Чисто из опыта 4ГБ ОЗУ одной SQL то было мало на сравнимой базе - предел по DBF и за, а тут еще сессии терминальные подвешены на серваке. Я бы и думать не стал удволи бы и все. Тут вопрос в винде сервачной - сожрет ли 8 и все. А так самое простое и экономически целесообразное решение.  Худже точно не будет, а дальше бы уже думать стал.
#87 by bushd
+86 если с памятью напряг подумал бы на перевод части юзверей с терминального клиента.
#88 by Кириллка
Напряг в дисковой подсистеме в первую очередь, а потом уже с памятью. Чтобы построить акт нужно перебрать за период горы данных тупым сканированием, хоть и, кластерного индекса. Физически это можно сравнить с тем, как золото добывают - большими экскаваторами выгребать руду, а потом искать писчинки золота. Вот ковш экскаватора это память скуля. И сессно, если ковш больше, то и загребать он сможет больше и, вроде как, дело пойдет быстрее. Но один фиг перебираем горы. Нужно искать подход такой, чтобы грести золотой песок - попадание в индекс. Как-то вот так :)
#89 by Chai Nic
Хорошо сказано!
#90 by DCKiller
Ну, сранение красивое, не спорю :) Только теория она теория и есть. На данный момент самый быстрый вариант - акт сверки, о котором речь в . И это не прямой, а обычный, бухгалтерский запрос 1С.
#91 by Chai Nic
(+88) Индекс в подобной аналогии - это подробный указатель координат точек, где этот золотой песок находится.. и рыть экскаватору приходится на порядки меньше.. и можно обойтись меньшим размером "ковша".
#92 by Кириллка
уже было сказано, что запрос ты нарисовал не верно. Логически он верен, конечно. Но часто решение в лоб не дает хороших результатов, что и доказал твой опыт. Вот смотри.. 0. sp_help '_1sentry' - вот тут тебе будет вся инфа по табличке. 1. изучаем индексы для этой таблички: PK__1SENTRY, ACCDTID, ACCKTID и другие не интересные. 2. твой запрос идет по идексу PK__1SENTRY - 100%, а это тупо проводки отсортированные по дате (упрощенно говоря), следовательно, чем больше период, тем страшнее. Вывод: нужно искать другие пути. Если у тебя включен отбор по Контрагентам (как уже тебе тут твердили) - Метаданные-ВидыСубконто-Контрагенты-Отбор, то у тебя в табличке _1ssbsel будет немного счастья. Потому как sp_help '_1ssbsel' кажет там индекс VALUE, из значений которого можно спозиционироваться в таблице _1SENTRY.
#93 by DCKiller
Где эти индексы находятся? В самой табличке _1SENTRY? Она у мну дюже здоровая... При попытке ее открыть QA мну на хутор за бабочками посылает :(
#94 by Кириллка
да.
#95 by DCKiller
Глянул. Тогда возникают след. вопросы: 1. По какому индексу оптимальнее строить запрос? 2. Как заставить RecordSet выполняться именно по этому индексу?
#96 by Кириллка
я, №;ять, на китайском написал чтоли?
#97 by DCKiller
"немного" счастья - это сколько? :)
#98 by DCKiller
_1ssbsel - это у нас таблица отбора субконто, я правильно понял?
Тэги: 1С 7.7 и ранее
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С