|
Серверная база, ускорение отчета в 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 раз дешевле.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |