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