Имя: Пароль:
1C
1С v8
как модифицировать запрос, чтобы он выполнялся быстрее?
0 avz07
 
11.07.13
17:50
люди подскажите как модифицировать этот запрос, чтобы он выполнялся быстрее,нужно очень срочно:

Запрос = Новый Запрос("ВЫБРАТЬ
                         |    Контрагенты.Ссылка КАК Контрагент
                         |ИЗ
                         |    Справочник.Контрагенты КАК Контрагенты,
                         |    (ВЫБРАТЬ
                         |        ВзаиморасчетыСКонтрагентамиОбороты.Контрагент.Ссылка КАК КонтрагентСсылка
                         |    ИЗ
                         |        РегистрНакопления.ВзаиморасчетыСКонтрагентами.Обороты(&ДатаНач, &ДатаКон, , ) КАК ВзаиморасчетыСКонтрагентамиОбороты) КАК ВзаиморасчетыСКонтрагентамиОбороты,
                         |    (ВЫБРАТЬ
                         |        ТоварыПолученныеОбороты.Контрагент.Ссылка КАК КонтрагентСсылка
                         |    ИЗ
                         |        РегистрНакопления.ТоварыПолученные.Обороты(&ДатаНач, &ДатаКон, , ) КАК ТоварыПолученныеОбороты) КАК ТоварыПолученныеОбороты
                         |ГДЕ
                         |    НЕ Контрагенты.ЭтоГруппа
                         |    И Контрагенты.Ссылка В ИЕРАРХИИ(&ГруппаКонтрагентов)
                         |    И Контрагенты.Ссылка = Контрагенты.ГоловнойКонтрагент
                         |    И НЕ Контрагенты.Ссылка В (&СЗ_Контрагенты)
                         |    И (Контрагенты.Наименование = ВзаиморасчетыСКонтрагентамиОбороты.КонтрагентСсылка.Наименование
                         |            ИЛИ Контрагенты.Наименование = ТоварыПолученныеОбороты.КонтрагентСсылка.Наименование)
                         |
                         |СГРУППИРОВАТЬ ПО
                         |    Контрагенты.Наименование,
                         |    Контрагенты.Ссылка
                         |
                         |УПОРЯДОЧИТЬ ПО
                         |    Контрагенты.Наименование");                      
   Запрос.УстановитьПараметр("ДатаНач",            НачалоДня(ДатаНач));
   Запрос.УстановитьПараметр("ДатаКон",            КонецДня(ДатаКон));
   Запрос.УстановитьПараметр("ГруппаКонтрагентов", ГруппаКонтрагентов);
   Запрос.УстановитьПараметр("СЗ_Контрагенты",     СЗ_Контрагенты);
1 Fragster
 
гуру
11.07.13
17:51
добавить Контрагенты.Ссылка В ИЕРАРХИИ(&ГруппаКонтрагентов) в условия виртуальных таблиц
2 Fragster
 
гуру
11.07.13
17:52
убрать условия по наименованию
3 Fragster
 
гуру
11.07.13
17:53
перенести условия в условия соединений - а то оптимизатор не всегда такое понимает, особенно для виртуальных таблиц
4 Cyberhawk
 
11.07.13
17:54
(1) а почему не всю ветку из "где"? (не считая наименований)
5 Fragster
 
гуру
11.07.13
17:55
(4) всю. но вообще - для такого запроса - я бы вообще соединение не делал, сделал бы объединение
, и сворачивание с отбором
6 Fragster
 
гуру
11.07.13
17:56
(5)+ но переход на объединение, конечно, зависит от данных получаемых
7 Fragster
 
гуру
11.07.13
17:57
в идеале:
1 подзапрос - получение потенциального списка контрагентов (выбор из справочника в иерархии и не в списке)
2 запрос - получение данных из таблиц
8 Fragster
 
гуру
11.07.13
17:58
(7)+ 2 запрос - с отбором по нашему списку контрагентов
9 avz07
 
11.07.13
18:05
спасибо! буду пробовать
10 acsent
 
11.07.13
18:06
это пи..дец какой то, а не запрос. Тут даже помочь нечем.
Все сжечь и заново построить
11 Aprobator
 
11.07.13
18:07
(10) +100500 я бы сказал, вольное сочинение на тему запроса.
12 Aprobator
 
11.07.13
18:08
но не запрос.
13 Aprobator
 
11.07.13
18:09
самое интересное, что результаты обращения к виртуальным таблицам, данному запросу глубоко пофиг. И их присутствие в запросе - ребус.
14 Fragster
 
гуру
11.07.13
18:09
(10) ради прикола сделай 2 таблицы через запятую, в ГДЕ укажи условие соединения и глянь в профайлер. Там все будет так же, как и при внутреннем соединении
15 Aprobator
 
11.07.13
18:10
(14) да пофин, конечное поле выбирается только с одной таблицы.
16 Fragster
 
гуру
11.07.13
18:11
единственное что - возможен сакральный смысл в соединении по наименованию. а может и нет его.
17 Aprobator
 
11.07.13
18:11
нахрена остальные две используются - тайна покрытая мраком.
18 Fragster
 
гуру
11.07.13
18:11
(15) так это внутреннее соединение
19 Aprobator
 
11.07.13
18:13
(18) а имена псевдонимов поля в посмотреть слабо? Он только в одном месте Контрагент. А у Виртуалок Контрагент Ссылка.
20 Aprobator
 
11.07.13
18:13
а млин
21 Aprobator
 
11.07.13
18:13
он их в ГДЕ запихнул.
22 Aprobator
 
11.07.13
18:14
не увидел )
23 Aprobator
 
11.07.13
18:15
ИМХО, сначала надо получить ВТКонтрагенты. А потом тупо получить данные из виртуалок с учетом данных данной ВТ.
24 Aprobator
 
11.07.13
18:16
(7) собственно все уже предложено ( Чего то я совсем ослеп нынче (((
25 alexhtn
 
11.07.13
18:18
Убрать  
И (Контрагенты.Наименование = ВзаиморасчетыСКонтрагентамиОбороты.КонтрагентСсылка.Наименование
                         |            ИЛИ Контрагенты.Наименование = ТоварыПолученныеОбороты.КонтрагентСсылка.Наименование)
                         |
                         |СГРУППИРОВАТЬ ПО
                         |    Контрагенты.Наименование,
                         |    Контрагенты.Ссылка

Добавить
ВНУТРЕННЕЕ СОЕДИНЕНИЕ
26 acsent
 
11.07.13
18:18
(18) и зачем????
27 GANR
 
11.07.13
18:28
(0) Как ускорить? - выкинуть этот запрос вообще и написать в данную ветку какую задачу должен решать запрос.
28 avz07
 
11.07.13
18:48
у меня есть обработка, которая должна выдавить в результате контрагентов без актов сверок за определенный период, должны учитываться клиенты которые имеют (еще не вернули) тару, оборудование. Вот код того что я сделал:


Процедура ПриОткрытии()
   
   ДатаНач = НачалоМесяца(ТекущаяДата());
   ДатаКон = ТекущаяДата();
   
   ГруппаКонтрагентов = Справочники.Контрагенты.НайтиПоКоду("1178");
   
КонецПроцедуры

Процедура ДействияФормыСформировать(Кнопка)
   
   Запрос = Новый Запрос("ВЫБРАТЬ РАЗЛИЧНЫЕ
                         |    АктСверкиВзаиморасчетов.Контрагент
                         |ИЗ
                         |    Документ.АктСверкиВзаиморасчетов КАК АктСверкиВзаиморасчетов
                         |ГДЕ
                         |    АктСверкиВзаиморасчетов.Дата МЕЖДУ &ДатаНач И &ДатаКон
                         |    И АктСверкиВзаиморасчетов.Проведен
                         |    И АктСверкиВзаиморасчетов.Контрагент В ИЕРАРХИИ(&ГруппаКонтрагентов)");
   Запрос.УстановитьПараметр("ДатаНач",            НачалоДня(ДатаНач));
   Запрос.УстановитьПараметр("ДатаКон",            КонецДня(ДатаКон));
   Запрос.УстановитьПараметр("ГруппаКонтрагентов", ГруппаКонтрагентов);
   
   СЗ_Контрагенты = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Контрагент");
   
   // ----------------------------------------------------------------------------
   
   Запрос = Новый Запрос("ВЫБРАТЬ
                         |    Контрагенты.Ссылка КАК Контрагент
                         |ИЗ
                         |    Справочник.Контрагенты КАК Контрагенты,
                         |    (ВЫБРАТЬ
                         |        ВзаиморасчетыСКонтрагентамиОбороты.Контрагент.Ссылка КАК КонтрагентСсылка
                         |    ИЗ
                         |        РегистрНакопления.ВзаиморасчетыСКонтрагентами.Обороты(&ДатаНач, &ДатаКон, , ) КАК ВзаиморасчетыСКонтрагентамиОбороты) КАК ВзаиморасчетыСКонтрагентамиОбороты,
                         |    (ВЫБРАТЬ
                         |        ТоварыПолученныеОбороты.Контрагент.Ссылка КАК КонтрагентСсылка
                         |    ИЗ
                         |        РегистрНакопления.ТоварыПолученные.Обороты(&ДатаНач, &ДатаКон, , ) КАК ТоварыПолученныеОбороты) КАК ТоварыПолученныеОбороты
                         |ГДЕ
                         |    НЕ Контрагенты.ЭтоГруппа
                         |    И Контрагенты.Ссылка В ИЕРАРХИИ(&ГруппаКонтрагентов)
                         |    И Контрагенты.Ссылка = Контрагенты.ГоловнойКонтрагент
                         |    И НЕ Контрагенты.Ссылка В (&СЗ_Контрагенты)
                         |    И (Контрагенты.Наименование = ВзаиморасчетыСКонтрагентамиОбороты.КонтрагентСсылка.Наименование
                         |            ИЛИ Контрагенты.Наименование = ТоварыПолученныеОбороты.КонтрагентСсылка.Наименование)
                         |
                         |СГРУППИРОВАТЬ ПО
                         |    Контрагенты.Ссылка
                         |
                         |УПОРЯДОЧИТЬ ПО
                         |    Контрагенты.Наименование");                      
   Запрос.УстановитьПараметр("ДатаНач",            НачалоДня(ДатаНач));
   Запрос.УстановитьПараметр("ДатаКон",            КонецДня(ДатаКон));
   Запрос.УстановитьПараметр("ГруппаКонтрагентов", ГруппаКонтрагентов);
   Запрос.УстановитьПараметр("СЗ_Контрагенты",     СЗ_Контрагенты);
   
   ТЗ.Загрузить(Запрос.Выполнить().Выгрузить());
   
КонецПроцедуры
29 ilpar
 
11.07.13
18:50
(28)
застрелись
30 ilpar
 
11.07.13
18:51
столько курсов в инете, все равно...
31 Fragster
 
гуру
11.07.13
19:13
вопрос. а сейчас оно выдает то, что нужно?
32 avz07
 
11.07.13
19:45
да. выводит, то что надо. но медленно.
33 avz07
 
11.07.13
20:10
на будущее, подскажите какую-то литературу по запросам, желательно чтобы была доступно написана
34 Fragster
 
гуру
11.07.13
20:42
35 FIXXXL
 
11.07.13
21:25
перенести всю отборочную тряхомудь в условия виртуальной таблицы и убрать сравнения по наименованиям

с фоксПро что ли переходишь?
36 avz07
 
12.07.13
16:15
(34) спасибо. ссылка супер!
37 IBTM
 
12.07.13
16:17
Держи, благодарить не надо:
ВЫБРАТЬ
                         |    Контрагенты.Ссылка КАК Контрагент
                         |ИЗ
                         |    Справочник.Контрагенты КАК Контрагенты,
ИЗ
                         |        РегистрНакопления.ВзаиморасчетыСКонтрагентами.Обороты(&ДатаНач, &ДатаКон, , ) КАК ВзаиморасчетыСКонтрагентамиОбороты) КАК ВзаиморасчетыСКонтрагентамиОбороты,
38 Бертыш
 
12.07.13
16:27
39 GANR
 
15.07.13
19:40
(33) http://www.sql-ex.ru/ - отличный тренажер.
40 avz07
 
22.07.13
17:49
люди, спасибо за ваше внимание и за ссылочку. сделай как хотел. работает точно и быстро. осознал что-то новое.