Вход | Регистрация
 

запрос работает неприлично долго

запрос работает неприлично долго
Я
   Shur1cIT
 
06.09.21 - 14:31
https://ibb.co/5GJSw5x
90 процентов выполнение запроса.
реквизит рткЗаявкаНаТранспортДокументыОснования.Документ имеет тип "Документ" те все документы,
те в результате запроса может быть любой  документ, вопрос возник, как ускорить данный запрос?
   Shur1cIT
 
1 - 06.09.21 - 14:34
(0) есть гипотеза, с начало получить просто документы во временную таблицу, а потом уже нужные поля выдирать, но не уверен что поможет
   Мультук
 
2 - 06.09.21 - 14:36
(1) Ты не пробуй дальше, особенно тут пробовать 5 мин переписать запрос
   Shur1cIT
 
3 - 06.09.21 - 14:37
как понял в данном запросе запрос получает все документы, а потом уже накладывает условия, если бы можно было бы сразу условия при выборке наложить
   ads55
 
4 - 06.09.21 - 14:37
(0) а зачем выбирать документ, если нужны только номер и дата?
   osa1C
 
5 - 06.09.21 - 14:38
(0) А запрос в Функции, он не в цикл ли попал?
   Chai Nic
 
6 - 06.09.21 - 14:39
Постгрес небось..?
   Shur1cIT
 
7 - 06.09.21 - 14:39
(5) нет это реально одиночный запрос так долго обрабатывает, смотрел отладчиком.
(6) нет
   ads55
 
8 - 06.09.21 - 14:40
(0) много оснований для распоряжения. Да и через точку ещё. Сократить виды документов-оснований можно?
   Shur1cIT
 
9 - 06.09.21 - 14:41
(8) нет к сожалению
   Shur1cIT
 
10 - 06.09.21 - 14:42
(8) это давно уже до меня делали, задача ускорить насколько возможно
   osa1C
 
11 - 06.09.21 - 14:42
(7) ну как в (4)  документ тебе не нужен, тебе только номер и дата вроде нужна... убери документ из запроса
   MyNick
 
12 - 06.09.21 - 14:46
(0) для получения представления поля Документ делается неявное соединение с таблицами всех документов.
   ads55
 
13 - 06.09.21 - 14:46
(10) сделай регистр номера и даты оснований, пусть туда все номер, дата и ссылка на основание пишется. А запрос уже к нему делай.
   patapum
 
14 - 06.09.21 - 14:46
(0) И реально там может быть любой документ из конфигурации, а не 5-6 разных типов? Не верю!
   Недопустимый
 
15 - 06.09.21 - 14:49
(0) 90 процентов выполнение запроса.
90% от какого времени?
   Megas
 
16 - 06.09.21 - 14:53
ВЫБРАТЬ
    &Ссылка
ПОМЕСТИТЬ врТаб
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
    врТаб.Ссылка.Дата,
    врТаб.Ссылка.Номер
ИЗ
    врТаб КАК врТаб

Даже так работает =)
   acht
 
17 - 06.09.21 - 14:55
(16) > ВЫБРАТЬ &Ссылка
Вот здесь ты неявно типизировал колонку, поэтому дальнейшее левое соединение будет только с одной таблицей.
   Chai Nic
 
18 - 06.09.21 - 14:59
В mssql очень неплохой профайлер, перехватывай запрос, смотри план
   Dmitrii
 
19 - 06.09.21 - 15:00
(16) Ему нужны номер и дата не от &Ссылка, а от документов, которые лежат в реквизите Документ табличной части &Ссылка.ДокументыОснования.
   Dmitrii
 
20 - 06.09.21 - 15:01
+ к (19) И полагаю, что тип у этого реквизита составной на множество различных ДокументСсылка.
   polosov
 
21 - 06.09.21 - 15:02
(0) В таком случае, я бы сначала выбрал все типы в выборке, потом на основе этих данных динамически собрал бы запрос с ВЫРАЗИТЬ(рткЗаявкаНаТранспортДокументыОснования.Документ КАК ТвойТипДокумента).Дата/Номер - по всем типам из первого запроса. Да, в 2 запроса + код, но должно быть быстрее.
   1Сергей
 
22 - 06.09.21 - 15:02
(20) Главное (0) не читай
   1Сергей
 
23 - 06.09.21 - 15:03
Зачем в 2021 веке может понадобится дата и номер? В третью систему что-то выгружаете?
   Почему 1С
 
24 - 06.09.21 - 15:03
(0) Какая архитектура такой и запрос, у тебя тут соединение со всеми документами конфигурации
   Ёпрст
 
25 - 06.09.21 - 15:04
(23) печатная форма жешь..
   polosov
 
26 - 06.09.21 - 15:06
(0) Или делай избыточность данных - в ТЧ добавляй поля Дата/Номер и заполняй их при создании документа.
   Почему 1С
 
27 - 06.09.21 - 15:06
(0) Ответ, в момент записи документа записывай номер и дату основания в реквизиты документа, решение не очень но для такой продуманной архитектуры конфигурации пойдет
   Deal with it
 
28 - 06.09.21 - 15:09
(0) вот ради интереса, если вообще не использовать запрос, а тупо перебрать циклом все документы в массиве/тз "рткЗаявкаНаТранспортДокументыОснования". Будет ли быстрее? У тебя есть ссылка на сам документ Заявки, а значит и доступ к реквизиту ДокументыОснования. Попробуй циклом перебрать.
   polosov
 
29 - 06.09.21 - 15:10
(28) Запросы в цикле к каждому документу?
   УдавВПопугаях
 
30 - 06.09.21 - 15:14
а сколько там данных в этой ТЧ? и 90% времени от скольки в секундах/минутах? + (1) и (16) надо попробовать то или как? логика в этом есть, если неявно преобразует и сделает только необходимые связи, то должно ускорить
 
 
   Deal with it
 
31 - 06.09.21 - 15:15
(29) есть просто цикл типа 
Для каждого Документ из ДокументыОснования Цикл
  Результат = Документ.Дата + "" Документ.Номе//или как там

КонецЦикла;
Может так быстрее будет
Не всегда запрос эффективнее тупого перебора.
   Deal with it
 
32 - 06.09.21 - 15:16
(31) + точнее 
ТЗ = рткЗаявкаНаТранспорт.ДокументыОснования.ВЫГРУЗИТЬ();

Для каждого Документ Из ТЗ цикл
   polosov
 
33 - 06.09.21 - 15:17
Тема - перепись говнокодеров.
   Deal with it
 
34 - 06.09.21 - 15:17
прост если у всех документов есть эти 2 параметра, то нам даже на тип их проверять не надо.
   УдавВПопугаях
 
35 - 06.09.21 - 15:18
(34) бывают документы без номера или даты?
   Deal with it
 
36 - 06.09.21 - 15:18
(33) вопрос не говнокода, а производительности, если это будет быстрее, то это не говнокод, а вынужденная мера.
   Deal with it
 
37 - 06.09.21 - 15:19
в общем я как вариант предложил, дальше ТС сам пусть решает
   УдавВПопугаях
 
38 - 06.09.21 - 15:20
(33) по теме: + 1 в переписи
   Dmitrii
 
39 - 06.09.21 - 15:20
Поэтому либо пробовать (1) и надеяться на то, что СУБД построит правильный план запроса, либо (13). Других способов нет.
Ну или извратиться с получением типов значений реквизита Документ, попавших в выборку, а потом в цикле собрать текст запроса, где уже обращаться к документам конкретных типов.
Подойдёт только если количество различных типов документов, попавших в табличную часть одного конкретно взятого документа рткЗаявкаНаТранспортДокументыОснования невелико.
По сути это аналог (31),(32). И кстати возможно, что (31) будет работать быстрее, если табличная часть ДокументыОснования небольшая (а весьма вероятно, что она небольшая).
   ads55
 
40 - 06.09.21 - 15:22
(33) самый скрепный штоле?
человек попросил помощь - он советы получил. Свой код покажи, раз обвиняешь.
   polosov
 
41 - 06.09.21 - 15:24
(40) Выше смотри, внимательно.
   arsik
 
42 - 06.09.21 - 15:25
(0) Сначала выбери все документы без их реквизитов. Потом уже реквизиты получай через:
СтруктураРеквизитовДокумента = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Выборка.Документ, "Номер, Дата");
   ads55
 
43 - 06.09.21 - 15:26
(41) в (38) - Точно!
   polosov
 
44 - 06.09.21 - 15:28
(43) Вот жеж обиженка. По делу есть что?
   Shur1cIT
 
45 - 06.09.21 - 15:30
Значительно ускорил выкинув Документ из полей получения, дальше как ускорять незнаю, другого варианта не вижу, странно что документ даёт такой тормоз это же по сути гуид и он такой же "общий" как номер и дата.
   Deal with it
 
46 - 06.09.21 - 15:30
Вот интересно, предлагать добавить в уже существующий документ 2 реквизита, которые заполняются только при записи, а значит предложить ТСу перезаписать все уже созданные для этого документы,чтобы смочь их вытянуть запросом -  не говноподход, а мой вариант сразу фи.
Само собой, что по хорошему это нужно было сделать еще на этапе проектирования этой доработки с документами основания, но мы имеем что имеем.
   ads55
 
47 - 06.09.21 - 15:30
(44) что было - сказал.
утверждение твое в (33) не понравилось. А так - без претензий.
   banco
 
48 - 06.09.21 - 15:33
(0) Пробуй ОбщегоНазначения.ЗначенияРеквизитовОбъектов()
   arsik
 
49 - 06.09.21 - 15:33
(45) А если оставить только документ, без всех полей?
   ptiz
 
50 - 06.09.21 - 15:34
(45) Сравни профайлером запрос до и после выкидывания.
   ads55
 
51 - 06.09.21 - 15:36
(44) кстати, посмотри (4) и (45)
   acht
 
52 - 06.09.21 - 15:37
(45) > это же по сути гуид
Нет. Это два поля - поле типа и поле двоичных данных ссылки. Добрая 1С скрывает это от тебя, но иногда строит запрос весьма пикантным образом.
   polosov
 
53 - 06.09.21 - 15:38
(51) Тупое ускорение, которое не может дать прироста.
У него в принципе запрос по одному документу, поэтому (42) хватит.
   lodger
 
54 - 06.09.21 - 16:58
(33) держи ещё один план выполнения задачи:

берем ссылку и пишем первый запрос по ней:
выбрать
документ как Доку
типзначение(документ) как ТипДоку
из ...
где ...
итоги по ТипДоку

делаем выборку с итогами

Результат = Неопределено;
Пока ВыборкаТипов.Следующий() Цикл
Запрос = новый Запрос();
Запрос.Текст = ФункияСборкиЗапросаПоТипу(ВыборкаТипов.ТипДоку);
ПараметрЗапроса = новый СписокЗначений();
детальки = ВыборкаТипов.Выбрать();
пока детальки.Следующий() Цикл
ПараметрЗапроса.Добавить(детальки.Доку);
конеццикла;
Запрос.УстановитьПараметр("Доки",ПараметрЗапроса);

Если Результат = неопределено Тогда
 Результат = Запрос.Выполнить().Выгрузить();
Иначе
Выборка = Запрос.Выполнить().Выбрать();
Пока выборка.Следующий() Цикл
заполнитьзначениесвойств(Результат.добавить(),выборка);
конеццикла;
конецесли;
конеццикла;
   youalex
 
55 - 06.09.21 - 17:47
по идее еще можно ТЧ выгрузить в ТЗ ,создать там доп. колонку с ОписаниеТипов - из конкретных типов, и цепляться уже по ней.
Как-то так:

    Запрос.Текст = "ВЫБРАТЬ ТЧ.Документ КАК Документ,  ТипЗначения(ТЧ.Документ) КАК ТипОбъекта ИЗ ТЧ";
    РезультатЗапроса = Запрос.Выполнить();
    
    ТЗ = РезультатЗапроса.Выгрузить();
    ТЗ.Колонки.Добавить("Документ2", Новый ОписаниеТипов(ОбщегоНазначенияКлиентСервер.СвернутьМассив(ТЗ.ВыгрузитьКолонку("ТипОбъекта"))));
    ТЗ.ЗагрузитьКолонку(ТЗ.ВыгрузитьКолонку(0), "Документ2");    

    Запрос.Текст = 
    "ВЫБРАТЬ вт.Документ2 поместить вт ИЗ &Таблица как вт; ВЫБРАТЬ вт.Документ2.Номер, Вт.Документ2.Дата ИЗ Вт вт ";
    Запрос.УстановитьПараметр("Таблица", ТЗ);
    Запрос.Выполнить();

   osa1C
 
56 - 07.09.21 - 06:26
(51)  и ещё плюс (11)  :-)
   rphosts
 
57 - 07.09.21 - 06:45
(0) Эээээ а если добавить в запрос ещё одно условие " И ТипЗначения(рткЗаявкаНаТранспортДокументыОснования.Ссылка) = ТипЗначения(&Ссылка)"  легче запросу не станет?
   Мультук
 
58 - 07.09.21 - 07:28
(57) У запроса нет проблем с полем "ссылка". у него проблема  с полем "документ"
   rphosts
 
59 - 07.09.21 - 07:45
(58) тогда таки типизация должна спасти отца русской демократии
   Вафель
 
60 - 07.09.21 - 08:31
Если есть общий журнал какой то можно дату номер оттуда брать
 
 
   ИУБиПовиц
 
61 - 07.09.21 - 09:37
Можно попробовать запросом во временную таблицу положить ТипЗначения(Документ) 
А в запросе выборке
1. Соединиться со  временной таблицей левой
2. Через объединить перечислить все типы документов где документ ССЫЛКА док1 объединить где документ  ССЫЛКа док2.  (ну и док, док.номер, дата обернуть в выразить)
хз может будет побыстрее.
т.е. через ссылку и выразить мы типизируем а связью по типам отсекаем ненужные соединения
   lodger
 
62 - 07.09.21 - 10:14
(61) делать такого кадавра в запросе выйдет дороже по ресурсам и километрам кода, чем просто запросить 2 раза.
можно замоддить (54) на постройку запроса с объединением для второй итерации.
получится один запрос к ТЧ и типизации, второй запрос уже к конкретным таблицам с конкретными типами и ссылками. писать - одна страница кода. выполнятся будет - молниеносно, по сравнению с соединениями всех таблиц документов.
   Малыш Джон
 
63 - 07.09.21 - 10:15
(0) 90% - это, конечно, хорошо, а сколько раз он вызывается? а то может у тебя эта функция в цикле крутится
   Малыш Джон
 
64 - 07.09.21 - 10:18
(62) а хз, сколько там типов документов по факту используется. А то может только 2-3 типа и есть в таблице. Тогда не кадавр, а вполне себе милый запросик получается.
   lodger
 
65 - 07.09.21 - 10:25
(64) завтра приделают ещё один документ к этому делу.
через неделю ещё.
в следующем году по закону обяжут сделать к каждому документу зеркальный.
кадавр с каждой итерацией будет расти и тяжелеть в чтении, редактуре и исполнении, а самогенерирующийся код не устаревает, как Буханка, работает надежно, как АК, и быстро, как МиГ.
   Малыш Джон
 
66 - 07.09.21 - 10:32
(65) генерирующийся на ходу текст запроса весьма хренов в отладке (привет от ЗУП 3).
А раз в неделю документы не приделывают. Если несколько лет использовался только 2-3 вида документа - это значит схема отлажена и менять её на ходу не будут, а если будут, то изменить конкретно этот запрос  - это вот прям самая небольшая проблема будет.
Это же не регучет, это оперативный учет, внутренний для компании.
   lodger
 
67 - 07.09.21 - 10:41
(66) ты точно (0) читал? там именно внутренний упр учёт, который сегодня так, завтра директору жахнуло в голову сяк, а после отпуска он проспался и переиначил як.
когда есть ресурсы на перестройку цифровых бизнес процессов на лету - их перестраивают на лету.
   Ботаник Гарден Меран
 
68 - 07.09.21 - 10:46
В типовых для таких случаев есть регистр сведений ДанныеПервичныхДокументов
   Малыш Джон
 
69 - 07.09.21 - 10:49
(67) читал. ТС немного неверно оценивает ситуацию. Если там МОГУТ БЫТЬ все типы документов, это не значит, что там ЕСТЬ все типы документов.

>>там именно внутренний упр учёт

ну, во-первых, не управленческий, а оперативный; во-вторых, я так и написал: внутренний оперативный учет.

>>который сегодня так, завтра директору жахнуло в голову сяк, а после отпуска он проспался и переиначил як.

Все может быть. Я не говорю, что этого быть не может. Я говорю, что это комплексный процесс, который затрагивает не только конкретно этот запрос. И на фоне общих затрат на добавление нового типа документа, ресурсы на изменение конкретно этого запроса - это очень и очень немного. Хоть каждый раз по-новому его переделывай.
   2mugik
 
70 - 07.09.21 - 10:59
(0)Тоже кстати удивлялся что данных нет, а 100500 таблиц пустых время прямо капитально увеличивают. везде выразить теперь.


Список тем форума
 
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.