Имя: Пароль:
1C
 
Серверная база, ускорение отчета в 20 раз?
,
0 Мигрень
 
17.08.22
09:49
Отчет такой наваял в УТ. Берется массив номенклатуры порядка 1000 элементов. Подаётся на вход цикла. В цикле выполняются два тяжелых запроса. Первый запрос – это известный алгоритм-имитация коррелированного запроса, вычисляет последние документы в разрезе некоего реквизита, без ограничения по периоду. Вычисленные документы подаются на вход второго запроса, который опираясь на эти документы находит связанные с ними документы расходов и затрат. Тоже без ограничения по периоду.

Так вот, для одного прохода цикла на моей файловой базе (быстрый комп, ssd и т.д.) требуется 4 сек. Отчет выполняется около часа. После переноса на сервер, отчет стал выполняться за 3 мин. Ускорение в 20 раз. Почему такое может быть?
1 Волшебник
 
17.08.22
09:50
Потому что вот: "В цикле выполняются два тяжелых запроса"
2 Kassern
 
17.08.22
09:53
Зачем здесь запрос в цикле? Я правильно понял, что вы для каждой номенклатуры выполняли 2 тяжелых запроса? Что мешало передать массив номенклатуры в запрос и выполнить его один раз?
3 Krendel
 
17.08.22
09:55
(2) Думаешь это религия?
4 Мигрень
 
17.08.22
09:56
(2) думал в эту сторону, мне надо получить результат по каждой номенклатуре, а не использовать этот массив номенклатуры как отбор. Мой алгоритм мне проще и понятней, чем сочинять какой-то сложный запрос
5 ДедМорроз
 
17.08.22
09:57
Запрос в цикле - очень похоже,что sql понял суть запроса и закешировал план выполнения м промежуточные таблицы.
Ну и для sql часто запрос в цикле - очень хорошо.
6 Kassern
 
17.08.22
09:58
(4) Так вы в любом случае делаете отбор по номенклатуре и разница лишь в результате запроса - или у вас данные по одной номенклатуре вернутся, или по массиву.
7 Kassern
 
17.08.22
09:59
(5) а может не понять суть, или коряво закешировать. И запрос вместо 3мин будет час обрабатываться. Может все же писать запросы в цикле там где это уместно?
8 lodger
 
17.08.22
10:10
(0) встроенный оптимизатор SQL за тебя работу выполнил. пойди в кассу за зарплатой.
9 Мигрень
 
17.08.22
10:19
(6) нет, там внутри цикла довольно сложные процессы происходят. Поэтому если переписать всё это на цепочку пакетных запросов, у них там какие-то сложные взаимосвязи будут. Может даже еще и хуже выйдет.
А тут просто, тупо и наглядно: получил - отдал следующему, тот обработал, получил, отдал следующему и т.д. Тем более, что вон говорят, что оптимизатор больше половины моей зарплаты за меня получает. Ну прелестно же.
10 Мигрень
 
17.08.22
10:21
+ (9) Да, главное забыл, отладка. Я этот ваш "одним запросом" неделю отлаживать буду
11 СеменовСемен
 
17.08.22
10:22
Скл данные закешировал. Поэтому и быстро
12 Dmitrii
 
гуру
17.08.22
10:22
(7) >> Может все же писать запросы в цикле там где это уместно?

Безусловно.
Но, чтобы понять где и насколько это уместно, надо точнее знать задачу и все особенности её самой и структуры данных в базе.
В общем случае наверняка задачу из (0) можно решить запросом без циклов. Или меньшим количеством циклов.

Вопрос только насколько это имеет смысл.
Иногда усложнение текста запроса достигает такого уровня, что чтение и анализ текста превращается в муку, а выигрыш от скорости не имеет особого смысла (как в случае отчета, формирование которого пользователь может и подождать). А может быть и ситуация "оптимизатор может не понять суть, или коряво закешировать, и запрос вместо 3мин будет час обрабатываться" только лишь из-за особенностей массива отобранной номенклатуры или размера таблиц и актуальности индексов.
13 Kassern
 
17.08.22
10:25
(10) А в чем проблема отладки? Это же запрос должен выдавать одинаковую инфу по одной позиции номенклатуры, если вы в отбор передали массив, либо просто ее одну. Всегда можно через консоль запросов прогнать и посмотреть содержимое временных таблиц, чтобы понять что к чему. В общем это ваше дело, если устраивает, то в перед, главное чтобы оптимизатор в следующий раз не подвел)
14 СеменовСемен
 
17.08.22
10:27
(13) проблема отлпдки запросов в том что никаких инструментов отладки нет.
Только вход и выход
15 Kassern
 
17.08.22
10:28
(14) ну как же, можно посмотреть промежуточные таблицы (временные)
16 ansh15
 
17.08.22
10:59
>>закешировал
В PostgreSQL такой финт не пройдет, чтобы до кассы дойти, самому оптимизатором попотеть надо будет..
17 1Сергей
 
17.08.22
11:03
(16) серьёзно? Ну вот ещё один плюс в копилку мсскл
18 Kassern
 
17.08.22
11:05
(17) а сейчас есть возможность его купить в РФ у мелкомягких?
19 Krendel
 
17.08.22
11:06
(18) купить -да, могу продать
20 1Сергей
 
17.08.22
11:06
(18) сейчас не обязательно покупать :)
21 Krendel
 
17.08.22
11:09
(20) есть поправки к закону о пиратсве?
22 Kassern
 
17.08.22
11:11
(20) (21) там есть нюансы, но не думаю, но к скулю от мелкомягких это не относится, так как есть альтернатива в виде постгри
23 1Сергей
 
17.08.22
11:13
(21) нет
24 Kassern
 
17.08.22
11:17
После приостановки работы Microsoft, IBM и Oracle в России власти подготовили комплекс мер по поддержке компаний, пользовавшихся их продуктами. Одной из них может стать "снятие ограничения на использование интеллектуальной собственности, содержащейся в товарах, поставки которых в Россию ограничены
https://rg.ru/2022/03/09/otechestvennye-kompanii-ne-budut-nakazyvat-za-narushenie-na-soft.html
25 ansh15
 
17.08.22
11:20
(17) Там есть конструкция prepare/execute, дающая возможность закешировать, но все это на усмотрение программиста. Использует ли 1С эту возможность в трансляторе для PostgreSQL, я не знаю.
26 1Сергей
 
17.08.22
11:22
(24) Это был законопроект, который не приняли
27 Salimbek
 
17.08.22
12:08
(0) Данные в запросах вы и так получаете на сервере. А форму отчета - и так показываете на Клиенте. Поэтому ваш вопрос упирается в простое - а что именно в итоге вы перенесли на сервер?
28 Krendel
 
17.08.22
13:42
(26) вот и ответ
29 Krendel
 
17.08.22
13:56
Но купить можно, как и легально активировать
30 Мигрень
 
17.08.22
14:35
(27) Я перенес отчет из файловой базы на серверную. У 1С есть два разных режима работы файловый и серверный. Серверный предполагает SQL, трехзвенку и вот это вот всё. А файловый ничего не предполагает, он у меня на компе и стоит в 10 раз дешевле.