Имя: Пароль:
1C
1С v8
Оптимизация запроса. Где ошибка?
0 arsik
 
гуру
27.06.12
17:59
Пример №1 - выполняется до скончания века

   Запрос.Текст = "ВЫБРАТЬ
                  |    Номенклатура.Ссылка КАК Ссылка
                  |ИЗ
                  |    Справочник.Номенклатура КАК Номенклатура
                  |ГДЕ
                  |    Номенклатура.Ссылка В ИЕРАРХИИ(&мГрупп)
                  |ИТОГИ ПО
                  |    Ссылка ИЕРАРХИЯ";
   мНоменклатуры = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка");

   Запрос.Текст = "ВЫБРАТЬ
                  |    ЕдиницыИзмерения.Ссылка
                  |ИЗ
                  |    Справочник.ЕдиницыИзмерения КАК ЕдиницыИзмерения
                  |ГДЕ
                  |    ЕдиницыИзмерения.Владелец В(&мНоменклатуры)";
   Запрос.УстановитьПараметр("мНоменклатуры",мНоменклатуры);
   мЕдиниц = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка");



Пример №2 - выполняется быстро

   Запрос.Текст = "ВЫБРАТЬ
                  |    ЕдиницыИзмерения.Ссылка
                  |ИЗ
                  |    Справочник.ЕдиницыИзмерения КАК ЕдиницыИзмерения
                  |ГДЕ
                  |    ЕдиницыИзмерения.Владелец В ИЕРАРХИИ(&мГрупп)";
   мЕдиниц = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка");

В примере мГрупп - это массив групп и элементов справочника номенклатуры
Платформа (8.1.15.14) сервер постгри
Почему первый вариант работает так медленно?
1 1C-band
 
27.06.12
18:02
ИТОГИ чего?!
2 arsik
 
гуру
27.06.12
18:08
(1) Итоги ничего. Просто мне нужно вытащить всех родителей. Допустим если в мГрупп есть элемент не верхнего уровня.
Попробовал вариант с соединением тоже очень быстро.

   глМВТ = Новый МенеджерВременныхТаблиц;
   Запрос = Новый Запрос;
   Запрос.МенеджерВременныхТаблиц = глМВТ;
   
   Запрос.Текст = "ВЫБРАТЬ
                  |    Номенклатура.Ссылка КАК Ссылка
                  |ПОМЕСТИТЬ тНоменклатуры
                  |ИЗ
                  |    Справочник.Номенклатура КАК Номенклатура
                  |ГДЕ
                  |    Номенклатура.Ссылка В ИЕРАРХИИ(&мГрупп)
                  |
                  |ИНДЕКСИРОВАТЬ ПО
                  |    Ссылка";
   
   Запрос.УстановитьПараметр("мГрупп",Узел.ПараметрыИБ.ФильтрПоНоменклатуре.ВыгрузитьКолонку("Номенклатура"));
   Запрос.Выполнить();
   
   Запрос.Текст = "ВЫБРАТЬ
                  |    ЕдиницыИзмерения.Ссылка
                  |ИЗ
                  |    Справочник.ЕдиницыИзмерения КАК ЕдиницыИзмерения
                  |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ тНоменклатуры КАК тНоменклатуры
                  |        ПО ЕдиницыИзмерения.Владелец = тНоменклатуры.Ссылка";
   Запрос.Выполнить();
3 arsik
 
гуру
27.06.12
18:09
В примере 1 зависает второй запрос по единицам.
4 Джинн
 
27.06.12
18:10
Почему не одним запросом?
5 arsik
 
гуру
27.06.12
18:11
(4) Мне потом массив мНоменклатуры очень много раз понадобится.
6 arsik
 
гуру
27.06.12
18:15
Можно было бы конечно соединением делать. Запихать в начале во временную таблицу номенклатуру.
Но в этом случае иерархию во временную таблицу не поместить.
7 SUA
 
27.06.12
18:21
а почему тогда не сделать 2 запроса раз все равно надо? пример 1 запрос 1 и пример 2
8 SUA
 
27.06.12
18:21
и одним пакетным запросом заодно
9 arsik
 
гуру
27.06.12
18:57
(7) (8) Сделаю через временныеТаблицы.
Тут мне умные люди объяснили, передавать в запрос лучше не Массивом.
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn