Имя: Пароль:
1C
1C 7.7
v7: Бухгалтерия 7.7: тормоза из-за акта сверки
0 DCKiller
 
15.08.11
10:34
Добрый день. Проблема следующая: бехгалтерия 7.7 (sql), в базе одновременно работают 10 пользователей. Как только кто-то из них запускает формирование акта сверки, скажем, за месяц, все остальные начинают жутко тормозить. Как лечится эта проблема?
И еще момент. Во время групповой обработки документов частенько вылетает сообщение об ошибке "Время ожидания блокировки таблицы 1SJourn истекло". В принципе, это и так понятно, что таблица журнала доков в момент записи/проведения конкретного документа блокируется для всех остальных юзеров, но - опять же, - вроде бы есть какой-то патч?
19 Кириллка
 
17.08.11
07:28
(18)мож ты к полю Vdtsc0 обращаешься? Код нужно видеть.
20 zak555
 
17.08.11
07:29
(0) дело в том, что 1с не использует БухЗапрос
21 DCKiller
 
17.08.11
07:29
(19) Лови:

SELECT
   |    Проводки.DocID As [Док $Документ],
   |    Жур.IDDocDef As Док_вид,
   |    Проводки.SUM_ As СуммаПроводки,
   |    Проводки.AMOUNT As КолВо,
   |    Проводки.ACCDTID As [СчетДт $Счет.Основной],
   |    Проводки.ACCKTID As [СчетКт $Счет.Основной],
   |    Проводки.DTSC0 As СубконтоДт1
   |FROM
   |    _1SENTRY As Проводки (NOLOCK)
   |INNER JOIN
   |    _1SJourn As Жур (NOLOCK)
   |ON
   |    Проводки.DocID = Жур.IDDoc
   |WHERE
   |    Проводки.Active <> '*'
   |    AND (Жур.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата~)
   |    AND (Проводки.ACCDTID IN (SELECT val FROM #ВТСчет) OR
   |         Проводки.ACCKTID IN (SELECT val FROM #ВТСчет))
22 Кириллка
 
17.08.11
07:33
(21)на ЭТОМ запросе валится ошибка? Или это уже что-то другое?
23 DCKiller
 
17.08.11
07:41
(22) Да, ошибка именно в таком виде. Если убрать Проводки.DTSC0 As СубконтоДт1, то запрос выполняется успешно.
24 Креатив
 
17.08.11
07:48
(0)Поищи на Инфоstarte. Я переделывал для УСН, но смысл тот же. Заменил ВыбратьОперации с проводками  на использование бухитогов. Работает в разы быстрее.
25 Кириллка
 
17.08.11
07:55
(23)показывай тогда остальной обвес. Ошибки в запросе нет. Или ты не все показываешь!
26 DJ Anthon
 
17.08.11
08:17
(0) акт сверки сам по себе тупой. когда-то я его переделывал. сейчас уже не вспомню
27 DCKiller
 
17.08.11
08:27
(25) Что еще показать? Весь код процедуры? Мне вот тоже непонятно, почему из-за одной этой строки такая ошибка вываливается. Мож это там в самой таблице в этом поле где глюк какой сидит?
28 DCKiller
 
17.08.11
08:33
+27 всё, заработало :-) мой косяк был. В-общем, вариант в (23) рабочий. Теперь возникает вопрос, как это значение привести к типу 1с?
29 DCKiller
 
17.08.11
09:24
усё, со всем разобрался вроде бы :-)
30 DCKiller
 
17.08.11
14:07
ппц, я в шоке... Вот ведь какая хрень: сделал замер скорости выполнения обычного акта сверки 1С и сделанного на прямом запросе (см. (23)), с одними и теми же условиями. Так вот что получилось:
- время выполнения первого - 8 сек.
- время выполнения второго - 98 сек...

Прямые запросы меня начинают все больше разочаровывать... :(((
Как такое вообще может быть?! Что делать?
31 zak555
 
17.08.11
14:07
(30) см. в (20)
32 DCKiller
 
17.08.11
14:09
(31) То есть ускорить через прямой запрос эту фигню никак не получится?! :(((((((((((
33 Попытка1С
 
17.08.11
14:11
Почитай про класс прямой запрос, там вроде ВТ несколько оптимизированы, да и писать удобнее.
34 zak555
 
17.08.11
14:18
(32) хз
35 Кириллка
 
17.08.11
14:35
(30)Попросить людей или сделать самому правильно. Чтобы сделать самому правильно, нужно попытаться понять, что ты своим запросом, с большой вероятностью, сканируешь кластерный индекс - отсюда и все проблемы.
36 Jaffar
 
17.08.11
15:49
(30) ты жалуешься или хвастаешься? :-)
37 DCKiller
 
17.08.11
15:51
(35) Можешь ткнуть в нужном направлении? Как можно оптимизировать запрос из (23), чтобы он шустрее работал?
38 leshikkam
 
17.08.11
15:58
(37) Тебе же уже сказали - использовать виртуальные таблицы
39 DCKiller
 
17.08.11
16:00
(38) Где про них можно почитать? Именно про таблицы для 1SEntry
40 leshikkam
 
17.08.11
16:04
(39) тебе надо использовать один из классов на базе 1С++
Либо ПрямойЗапрос либо AccountsRecordset
41 DCKiller
 
17.08.11
16:06
(40) Интересно... Что такого волшебного в этих классах, что только они позволяют ускорить запрос к таблице проводок?
42 DCKiller
 
17.08.11
16:06
Есличо, с классами вообще пока что не работал
43 leshikkam
 
17.08.11
16:35
44 Дык ё
 
17.08.11
16:46
(41) они попадают в индексы получше, чем ты в (21). можно и без классов - посмотри на план выполнения и подумай
45 DCKiller
 
17.08.11
19:43
(44) Чо за план, как куриццо?
46 DCKiller
 
17.08.11
19:45
(43) Это я уже видел. Что там должно мне указать на то, как ускорить мой запрос?
47 DCKiller
 
17.08.11
19:52
Вот что нарыл:

http://www.1cpp.ru/forum/YaBB.pl?num=1265705989

Там сначала чувак, задающий вопрос, приводит вот такой код без AccountRecordset:

ТекстЗапроса = "
     |SELECT
     |  entr.DTSC0 as [Субконто $Справочник.ВидыНоменклатуры],
     |  jur.iddoc as [Док $Документ],
     |  jur.iddocdef as [Док_вид],
     |  sum(entr.sum_)   as ДО
     |FROM
     |  _1sentry as entr
     |INNER JOIN _1sjourn as jur ON entr.docid = jur.iddoc
     |WHERE
     |  entr.date_time_docid between :НачДата and :КонДата~
     |  and entr.ACCDTID = :СчетДТ
     |GROUP BY entr.DTSC0,jur.iddoc,jur.iddocdef
     | ";    

Затем - с оным:

RS=СоздатьОбъект("AccountsRecordset");
     RS.УстБД1С();
     
     // обороты 90.1
     ТекстЗапроса = "
     |SELECT
     |  entr.DTSC0 as [КорСубконто $Справочник.Контрагенты],
     |  entr.KTSC0 as [Субконто $Справочник.ВидыНоменклатуры],
     |  jur.iddoc as [Док $Документ],
     |  jur.iddocdef as [Док_вид],
     |  sum(entr.sum_)   as КО
     |FROM
     |  _1sentry as entr
     |INNER JOIN _1sjourn as jur ON entr.docid = jur.iddoc
     |WHERE
     |  entr.date_time_docid between :НачДата and :КонДата~
     |  and entr.ACCDTID = :СчетДТ
     |  and (entr.ACCKTID = :СчетКТ1 or  entr.ACCKTID = :СчетКТ2)
     |  and $РазделительУчета = :Предприятие
     |GROUP BY entr.DTSC0,entr.KTSC0,jur.iddoc,jur.iddocdef
     | ";    

Товарищи, т.е. фактически получается, что вариант 2 будет быстрее выполняться по времени по сравнению с вариантом 1?
48 Дык ё
 
17.08.11
20:42
(45) http://msdn.microsoft.com/ru-ru/library/ms190402.aspx

(47) это совсем разные запросы, сравнивать время их выполнения не имеет смысла. а так, для эффективной работы варианта 2 в нем не хватает отборов по provkind и active
49 Chai Nic
 
17.08.11
21:15
Отбор по _1SENTRY почти всегда будет неоптимальным и тормозным. Акт сверки (обороты в разрезе движений) надо формировать бухзапросом, с отбором по субконто Контрагенты. Причем, по моему опыту - лучше не запускать запрос по всем счетам, а вызвать его несколько раз, по каждому счету, где есть субконто Контрагенты, далее эти данные свернуть в таблице значений. Почему-то несколько бухзапросов по одному счету выполняются значительно быстрее, чем один бухзапрос по списку счетов.
50 DCKiller
 
17.08.11
21:16
(49) Имеется в виду стандартный 1совский бухзапрос? Насколько быстрее?
51 zak555
 
17.08.11
21:22
(49) если ты не в курсе, можно счета не указывать, а разворачивать по контрам, а потом по счетам
смотри в сторону анализ субконто
52 Дык ё
 
17.08.11
21:28
(51) это будет тормозить, если по контрам не включен отбор
53 Chai Nic
 
17.08.11
21:29
(51) Можно по-разному.. главное не запускать бухзапрос по списку счетов. И не использовать ВыбратьОперацииСПроводками. У нас на бухии изначально был акт сверки жутко тормозным, когда ушли от глобального бухзапроса по всем счетам - сразу стало всё летать, повышение скорости на порядок или на два. sql-версия.
54 leshikkam
 
17.08.11
22:02
Товарисчи - есть такой файл который называется Отбор проводок по субконто - _1sbkttl. Так вот именно его а также отбор проводок по счетам и надо использовать
55 zak555
 
17.08.11
22:03
(52) нужно нужно смотреть только обороты
56 DCKiller
 
17.08.11
22:04
(54) Как в данном случае его использовать?
57 Дык ё
 
17.08.11
22:05
(55) это понятно. но без отбора по субконто это выльется в скан таблицы проводок
58 bushd
 
17.08.11
22:06
(0) Перепиши акт сверки). Он все равно как был уе..ким так и остался.
(6) Памяти мало. SQL жрет дофига, а там еще терминальный сервер. Это ППЦ. Так то вообще изврат, но способ (SQL + TS) вошел прочно в обиход.
59 zak555
 
17.08.11
22:10
(57) нет
у БИ три таблицы : итоги/остатки/проводки
будет по итогам идти
60 Дык ё
 
17.08.11
22:15
(59) у тебя уже тяпница? :-) в таблице итогов нет данных о документах-регистраторах движений

и таблиц там куда больше трех
61 bushd
 
17.08.11
22:17
+58 По момему проще памяти добросить - очевидно что ее мало. Потом написать нормальный акт сверки без всяких прямых запросов - они тут нафиг не нужны... имхо, и не трахать мозг, 10 пользователей всего. Ну любят люди извращаться на ровном месте.
62 Сияющий Асинхраль
 
17.08.11
22:18
(0) а можно вопрос не в тему? Зачем бухгалтерскую базу с паршивым десятком пользователей сажать на sql? Терминал плюс dbf будут работать намного быстрее
63 Chai Nic
 
17.08.11
22:20
(67) Память не поможет - всё равно последовательный скан это сильно не ускорит.. даже если сервер полностью базу закэширует. Алгоритмы надо переписывать. В типовой алгоритмы под sql не всегда оптимально построены..
64 zak555
 
17.08.11
22:24
(60) сколько больше ?
65 DCKiller
 
17.08.11
22:24
(62) Затем, что файл проводок уже вырос до нев..бенных размеров, и индексы уже не справляются с нагрузкой.
66 DCKiller
 
17.08.11
22:24
(61) "Нормальный" - это какой?
67 Chai Nic
 
17.08.11
22:26
(65) Индексы на то и предназначены, чтобы серверу было пофиг на память и быстродействие доступа к ней в первом приближении. Ибо логарифм.
68 bushd
 
17.08.11
22:33
(66) Я тут подумал - из за акта может тормозить по одной причине - нехватает памяти. Так что наверное и переписывать ничего не надо. Хотя типовой уродский, писал свои давненько работали гораздо приятнее с использованием бух запроса обычного.
69 bushd
 
17.08.11
22:35
+68 Все делал в одном запросе, потом выюборка и все. Код был крайне компактный.
70 DCKiller
 
17.08.11
22:36
(69) Стандартный бух. запрос?
71 bushd
 
17.08.11
22:37
Почему про память говорю, потмоу что никакие таблицы в акте тут не блокируються... следовательно все упираеться тупо в производитеьность, котороя резко падает если не хватает памяти - ввиду использования под недостающее винта.
72 bushd
 
17.08.11
22:37
(70) Да
73 bushd
 
17.08.11
22:38
(70) Но я его не на почве производительности писал. Прсто тогда актов вообще не было в типовых))) да было время)
74 bushd
 
17.08.11
22:39
+73 Или был совсем убогий
75 Chai Nic
 
17.08.11
22:39
(72) В таблице проводок хотя бы десяток мегазаписей есть? :)
76 bushd
 
17.08.11
22:42
(75) было наверное, я хрен его знает. Непомню уже.
77 bushd
 
17.08.11
22:43
(75) У человека тормозит не акт! Другие юзвери. Так что колбасить атк особого смысла не вижу.
78 DCKiller
 
17.08.11
22:43
Ладно, пока всем спасибо. Сегодня уже поздно, завтра буду проверять на работе все варианты. Что получится, отпишусь.
79 Chai Nic
 
17.08.11
22:44
Вообще, по моему личному опыту - память менее важна, чем правильные алгоритмы доступа к данным. Попытка загладить косяки памятью ущербна изначально - ибо рано или поздно данных станет больше, и памяти будет опять не хватать.
80 bushd
 
17.08.11
22:44
+77 Ну т.е смыс есть но после увеличения памяти. Но вообще я повторюсь SQL + TS это дурдом на мой взгляд. Это уж когда выхода нет. Клиенты дохлые совсем, а в DBF база не влазит.
81 bushd
 
17.08.11
22:52
(79) С фига ли ее станет надо больше? Акт формируеться за определнный период по контретному контрагенту. Т.е. ясное дело SQL зажрет еще себе сколько влезет, но к акту никакого отношения это не имеет.
Я вот что то думаю, что SQL столбит себе память, терминальные сессиям вероятно приходиться сосать... с диска). Както так. А править алгоритмы в данном конкретном случае тут дело третье. Добавте памяти страждущему. Ведь каждая сессия дофига жрет памяти а тут еще данные обработать надо. 4Гб для SQL + TS - фигово, как впрочем и сама конфигурация дурацкая - SQL + TS.
82 Сияющий Асинхраль
 
17.08.11
22:53
(65) согласен. Вопросов нет. Не хочешь поэкспериментировать? У меня в карточке есть ссылка на страничку, на этом адресе лежит несколько эртиков, один из них как раз акт сверки, он в свое время без проблем работал в базе с шестьюдесятью пользователями, а вдруг и у тебя покатит
83 bushd
 
17.08.11
22:55
(62) Кстати у меня один и тот же запрос Бух на SQL базе выполняеться в 10-ки раз быстрее чем на DBF. Практика. Правда я терминалы не сажу на SQL сервер)
84 Chai Nic
 
17.08.11
22:55
(81) Давать советы типа "добавьте памяти", не видя реального состояния системы, показаний счетчиков производительности в динамике, в часы наибольшей нагрузки и в среднем - по меньшей мере непрофессионально!
85 DCKiller
 
17.08.11
22:55
(82) спс, гляну
86 bushd
 
17.08.11
23:00
(84) А че тут видеть то? - Чисто из опыта 4ГБ ОЗУ одной SQL то было мало на сравнимой базе - предел по DBF и за, а тут еще сессии терминальные подвешены на серваке. Я бы и думать не стал удволи бы и все. Тут вопрос в винде сервачной - сожрет ли 8 и все. А так самое простое и экономически целесообразное решение.  Худже точно не будет, а дальше бы уже думать стал.
87 bushd
 
17.08.11
23:27
+86 если с памятью напряг подумал бы на перевод части юзверей с терминального клиента.
88 Кириллка
 
18.08.11
07:07
Напряг в дисковой подсистеме в первую очередь, а потом уже с памятью. Чтобы построить акт нужно перебрать за период горы данных тупым сканированием, хоть и, кластерного индекса. Физически это можно сравнить с тем, как золото добывают - большими экскаваторами выгребать руду, а потом искать писчинки золота. Вот ковш экскаватора это память скуля. И сессно, если ковш больше, то и загребать он сможет больше и, вроде как, дело пойдет быстрее. Но один фиг перебираем горы. Нужно искать подход такой, чтобы грести золотой песок - попадание в индекс. Как-то вот так :)
89 Chai Nic
 
18.08.11
07:13
(88) Хорошо сказано!
90 DCKiller
 
18.08.11
07:14
(88) Ну, сранение красивое, не спорю :) Только теория она теория и есть. На данный момент самый быстрый вариант - акт сверки, о котором речь в (82). И это не прямой, а обычный, бухгалтерский запрос 1С.
91 Chai Nic
 
18.08.11
07:14
(+88) Индекс в подобной аналогии - это подробный указатель координат точек, где этот золотой песок находится.. и рыть экскаватору приходится на порядки меньше.. и можно обойтись меньшим размером "ковша".
92 Кириллка
 
18.08.11
07:34
(90)уже было сказано, что запрос ты нарисовал не верно. Логически он верен, конечно. Но часто решение в лоб не дает хороших результатов, что и доказал твой опыт.

Вот смотри..
0. sp_help '_1sentry' - вот тут тебе будет вся инфа по табличке.
1. изучаем индексы для этой таблички: PK__1SENTRY, ACCDTID, ACCKTID и другие не интересные.
2. твой запрос идет по идексу PK__1SENTRY - 100%, а это тупо проводки отсортированные по дате (упрощенно говоря), следовательно, чем больше период, тем страшнее.
Вывод: нужно искать другие пути.

Если у тебя включен отбор по Контрагентам (как уже тебе тут твердили) - Метаданные-ВидыСубконто-Контрагенты-Отбор, то у тебя в табличке _1ssbsel будет немного счастья. Потому как sp_help '_1ssbsel' кажет там индекс VALUE, из значений которого можно спозиционироваться в таблице _1SENTRY.
93 DCKiller
 
18.08.11
07:41
(92) Где эти индексы находятся? В самой табличке _1SENTRY? Она у мну дюже здоровая... При попытке ее открыть QA мну на хутор за бабочками посылает :(
94 Кириллка
 
18.08.11
07:46
(93)да.
95 DCKiller
 
18.08.11
07:54
(92) Глянул. Тогда возникают след. вопросы:
1. По какому индексу оптимальнее строить запрос?
2. Как заставить RecordSet выполняться именно по этому индексу?
96 Кириллка
 
18.08.11
07:59
(95)я, №;ять, на китайском написал (92) чтоли?
97 DCKiller
 
18.08.11
08:02
(96) "немного" счастья - это сколько? :)
98 DCKiller
 
18.08.11
08:06
_1ssbsel - это у нас таблица отбора субконто, я правильно понял?
99 DCKiller
 
18.08.11
13:17
Делаю запрос с соединением таблиц журнала доков, 1ssbsel и 1sentry - вываливается ошибка "подключение занято до получения результатов для другого hstmt". Что опять за хня? SET NOCOUNT ON не помогло.
100 Grusswelle
 
18.08.11
13:18
100!
101 DCKiller
 
18.08.11
13:34
ап
102 Дык ё
 
18.08.11
13:38
(99) результат = рекордсет.выполнитьинструкцию(текстзапроса);
103 DCKiller
 
18.08.11
13:38
(102) ?
104 Дык ё
 
18.08.11
13:42
(103) используй выполнитьинструкцию вместо открыть/получить/закрыть
105 DCKiller
 
18.08.11
13:48
(104) Какие "открыть/получить/закрыть"? Ты о чем вообще?
106 Кириллка
 
18.08.11
13:52
(105)народ телепатирует как может.
107 bushd
 
18.08.11
14:40
(88) А SQL то думаете почему память выжирает? Кусок базы в памяти вертиться. Винт тут не причем.
108 bushd
 
18.08.11
14:41
+107 Если бы про DBF шла речь еще туда сюда... И то винда кэширует диск.
109 bushd
 
18.08.11
14:44
По моему чем второй день обсуждать, уже давно памяти можно было купить и попробовать .елси конечно это реально и память не спецефическая. Хотя судя по процу врядли. Это очень древний комп.
110 VladZ
 
18.08.11
14:47
(0) Что еще крутится на SQL-сервере?
111 Asirius
 
18.08.11
14:50
(0) лови оптимизированный акт.
http://info_start.ru/public/75034/
112 bushd
 
18.08.11
15:36
(109) Хотя судя по процу врядли, это очень древний комп.
Так правильно.
113 Chai Nic
 
18.08.11
16:00
(107) В памяти "вертится" кусок базы, к которому были последние обращения, это базовая стратегия кэширования. Как правило, на реальных задачах одновременный доступ сразу к гигабайтам данных не происходит. При увеличении объема кэша данные конечно с большей вероятностью окажутся в оперативной памяти, но прирост быстродействия тут явно не линейный. Можно увеличить объем памяти вдвое, но получить прирост быстродействия в единицы процентов.
114 bushd
 
18.08.11
22:24
(113) SQL память выжирает это факт. Какое там у нее кэширование и алгоритмы работы спамятью, я понятия не имею. Думаю как раз что вовсе не обычное кэширование. Потому что жрёт она сразу и не мало.  Кэширование, которое вы описали - это общий универсальный принцип для всех приложений - это ОС организует, СУБД думаю делает разумнее, вероятно знает какую информацию надо в память пихать, что бы потом за ней пореже на диск ползать, возможно и статистику ведет, возможно разработчик базы может подсказать.
Не знаю мне лично ситуация прозрачна. Напихать памяти в первую очередь. А дальше голову ломать.
У меня схожая ситуация была память 4Гб, бюджетка с типовым актом, размер как раз вышел за предел DBF (перестала загружаться в DBF), и ничего не тормозило из-за актов, SQL тоже 2000, только терминалов не было. Проц. был дохлее. Ну райд 3 был. Более того бух. запросы выполнялись постоянно оплату рассчитывали по документам (ну тут не оптимально конечно, и с основных итогов) - ничего, 20 юзверей сидело.
Все проблемы начинались при блокирвоках при тяжелых проведениях, ну а что бы из за акта - это фантастика.
115 DCKiller
 
19.08.11
06:05
(111) Ай, спасибо тебе, добрый человек!
116 zak555
 
19.08.11
07:38
(111) штатный ?
117 DCKiller
 
19.08.11
07:42
(116) Да, с периодичностью по проводкам. Летает :)
118 Erhov_egor
 
19.08.11
07:46
Давно бы так и сделал