Имя: Пароль:
1C
1С v8
запрос тормозит
0 mnail1979
 
12.04.12
13:25
Здравствуйте, уважаемые профессионалы.
1с 81 +sql server 2005  стоят на обычном компе- некий запрос утром работает быстро, под вечер чуть начинает притормаживать (совсем слегка). После ночного обновления статистики, реорганизации индексов и реиндексации на следующее утро все нормализуется.

Перенес 1с на отдельный HP сервер, SQL (уже 2008 R2) на отдельный. 1С стал работать намного шустрее, проводка документов и т.д. Но Этот самый запрос стал работать намного медленнее. Обновления статистики, реорганизации индексов и реиндексации не помогают. В чем может быть дело. План изменился чтоли. Запрос конечно ужасный - вложенные запросы и т.д. Но вопрос, почему не помогают регламентные заданя?
1 Maxus43
 
12.04.12
13:31
>>Запрос конечно ужасный
поэтому)
Надо начинать с потимизации запроса, а потом уж всё остальное
2 Капитан О
 
12.04.12
13:36
(0) >Запрос конечно ужасный
кто меня звал?
3 mnail1979
 
12.04.12
13:40
а как тогда объяснить то, что после сбора статистики все работало на обычной машинке, а на хороших серваках после сбора статистики ничего не работает. План выполнения поменялся чтоли?
4 mnail1979
 
12.04.12
13:41
как избавиться от вложенных запросов?
5 Maxus43
 
12.04.12
13:42
(3) что есть статистика? на основании неё и планы строятся. У 2008 СКЛ может быть своё мнение о планах.
(4) юзать ВТ наример
6 mnail1979
 
12.04.12
13:48
фигня какая то. Запускаю обработку, в которой сидит этот запрос - запрос срабатывает почти за 3 минуты.
Запускаю этот запрос в консоле отчетов - проходит моментально. После этого и обработка открывается моментально
7 Maxus43
 
12.04.12
13:51
кэшируется же инфа, моэет поэтому
8 mnail1979
 
12.04.12
13:55
(7) если так, тогда когда в первый у меня долго открывается обработка, потом я ее закрываю и снова открываю - должно ведь работать быстрее, а этого не происходит. Только после консоли отчетов скорость увеличивается.
9 Maxus43
 
12.04.12
13:58
(8) так в теории, что там реально происходит хз.
Сначала сделать запрос по феншую - потом эксперименты проводит с замерами проихзводительности, и запрос на стороне СКЛ уже смотреть
10 mnail1979
 
12.04.12
14:05
(9) Сначала сделать запрос по феншую - это как?
11 Maxus43
 
12.04.12
14:06
(10) есть целый ряд рекомендаций, в т.ч. и на ИТС статья... запрос в студию, люди скажут
12 Jstunner
 
12.04.12
14:08
3 минуты??
13 mnail1979
 
12.04.12
14:16
ВЫБРАТЬ
   ТоварыКРаспределениюПоРейсамОстатки.ЗаказПокупателя.Контрагент.КодОракл КАК КодОракл,
   ВЫБОР КОГДА ТоварыКРаспределениюПоРейсамОстатки.ЗаказПокупателя.Грузополучатель=ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка) ТОГДА ТоварыКРаспределениюПоРейсамОстатки.ЗаказПокупателя.Контрагент.Регион ИНАЧЕ ТоварыКРаспределениюПоРейсамОстатки.ЗаказПокупателя.Грузополучатель.Регион КОНЕЦ КАК Регион,
   ТоварыКРаспределениюПоРейсамОстатки.ЗаказПокупателя.Контрагент КАК Контрагент,
   ТоварыКРаспределениюПоРейсамОстатки.ЗаказПокупателя.Контрагент.Наименование КАК КонтрагентНаименование,
   ТоварыКРаспределениюПоРейсамОстатки.ЗаказПокупателя КАК Заказ,
   ТоварыКРаспределениюПоРейсамОстатки.Номенклатура,
   ТоварыКРаспределениюПоРейсамОстатки.ХарактеристикаНоменклатуры,
   ТоварыКРаспределениюПоРейсамОстатки.СерияНоменклатуры,
   ТоварыКРаспределениюПоРейсамОстатки.ЕдиницаИзмерения,
   ТоварыКРаспределениюПоРейсамОстатки.ТипПоставки,
   ТоварыКРаспределениюПоРейсамОстатки.Цена,
   ТоварыКРаспределениюПоРейсамОстатки.СтавкаНДС,
   ТоварыКРаспределениюПоРейсамОстатки.КоличествоОстаток КАК КоличествоКРаспределению,
   ТоварыКРаспределениюПоРейсамОстатки.СуммаВзаиморасчетовОстаток КАК Сумма,
   ТоварыКРаспределениюПоРейсамОстатки.ЕдиницаИзмерения.Вес * ТоварыКРаспределениюПоРейсамОстатки.КоличествоОстаток / ТоварыКРаспределениюПоРейсамОстатки.ЕдиницаИзмерения.Коэффициент *ТоварыКРаспределениюПоРейсамОстатки.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент КАК Вес,
   ТоварыКРаспределениюПоРейсамОстатки.СуммаУпрОстаток КАК СуммаУпр,
   ТоварыКРаспределениюПоРейсамОстатки.ЕдиницаИзмерения.Объем * ТоварыКРаспределениюПоРейсамОстатки.КоличествоОстаток / ТоварыКРаспределениюПоРейсамОстатки.ЕдиницаИзмерения.Коэффициент *ТоварыКРаспределениюПоРейсамОстатки.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент КАК Объем,
   ТоварыКРаспределениюПоРейсамОстатки.ЗаказПокупателя.Дата,
   ТоварыКРаспределениюПоРейсамОстатки.ЗаказПокупателя.Номер,
   ЕСТЬNULL(ТоварыНаСкладахОстатки.КоличествоОстаток, 0) - ЕСТЬNULL(ТоварыВРейсах.КоличествоОборот, 0) КАК КоличествоОстаток
   ИЗ
   РегистрНакопления.ТоварыКРаспределениюПоРейсам.Остатки(&Дата,  ЗаказПокупателя.ДатаОтгрузки >= &ЗаказПокупателяДатаНачала  и  ЗаказПокупателя.ДатаОтгрузки <= &ЗаказПокупателяДатаКонца ) КАК ТоварыКРаспределениюПоРейсамОстатки
       ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(&ДатаРейс, Склад.ТипСклада <> &СкладМашина) КАК ТоварыНаСкладахОстатки
       ПО ТоварыКРаспределениюПоРейсамОстатки.Номенклатура = ТоварыНаСкладахОстатки.Номенклатура
           И ТоварыКРаспределениюПоРейсамОстатки.ХарактеристикаНоменклатуры = ТоварыНаСкладахОстатки.ХарактеристикаНоменклатуры
           И ТоварыКРаспределениюПоРейсамОстатки.СерияНоменклатуры = ТоварыНаСкладахОстатки.СерияНоменклатуры
       ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
           СУММА(ВЫБОР
                   КОГДА ВложенныйЗапрос1.КоличествоОборот - ЕСТЬNULL(ВложенныйЗапрос2.КоличествоПриход, 0) > 0
                       ТОГДА ВложенныйЗапрос1.КоличествоОборот - ЕСТЬNULL(ВложенныйЗапрос2.КоличествоПриход, 0)
                   ИНАЧЕ 0
               КОНЕЦ) КАК КоличествоОборот,
           ВложенныйЗапрос1.Номенклатура КАК Номенклатура,
           ВложенныйЗапрос1.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
           ВложенныйЗапрос1.СерияНоменклатуры КАК СерияНоменклатуры
       ИЗ
           (ВЫБРАТЬ
              ТоварыВРейсахОбороты.Рейс КАК Рейс,
               ТоварыВРейсахОбороты.Номенклатура КАК Номенклатура,
               ТоварыВРейсахОбороты.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
               ТоварыВРейсахОбороты.СерияНоменклатуры КАК СерияНоменклатуры,
               СУММА(ЕСТЬNULL(ТоварыВРейсахОбороты.КоличествоОборот, 0)) КАК КоличествоОборот
           ИЗ
               РегистрНакопления.ТоварыВРейсах.Обороты(, , ,  Состояние <> &CостояниеРейсаЗакрыт ) КАК ТоварыВРейсахОбороты
           
           СГРУППИРОВАТЬ ПО
              ТоварыВРейсахОбороты.Рейс,
               ТоварыВРейсахОбороты.Номенклатура,
               ТоварыВРейсахОбороты.ХарактеристикаНоменклатуры,
               ТоварыВРейсахОбороты.СерияНоменклатуры) КАК ВложенныйЗапрос1
               ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
                   ТоварыНаСкладахОбороты.Номенклатура КАК Номенклатура,
                   ТоварыНаСкладахОбороты.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
                   ТоварыНаСкладахОбороты.СерияНоменклатуры КАК СерияНоменклатуры,
                   ТоварыНаСкладахОбороты.Регистратор.Рейс КАК РегистраторРейс,
                   СУММА(ТоварыНаСкладахОбороты.КоличествоПриход) КАК КоличествоПриход
               ИЗ
                   РегистрНакопления.ТоварыНаСкладах.Обороты(, , Регистратор, Склад.ТипСклада = &СкладМашина) КАК ТоварыНаСкладахОбороты
               ГДЕ
                   ТоварыНаСкладахОбороты.Регистратор ССЫЛКА Документ.ПеремещениеТоваров
                   И ТоварыНаСкладахОбороты.Регистратор.СкладПолучатель.ТипСклада = &СкладМашина
                                       
               СГРУППИРОВАТЬ ПО
                   ТоварыНаСкладахОбороты.Номенклатура,
                   ТоварыНаСкладахОбороты.ХарактеристикаНоменклатуры,
                   ТоварыНаСкладахОбороты.СерияНоменклатуры,
                   ТоварыНаСкладахОбороты.Регистратор.Рейс) КАК ВложенныйЗапрос2
               ПО ВложенныйЗапрос1.Рейс = ВложенныйЗапрос2.РегистраторРейс
                   И ВложенныйЗапрос1.Номенклатура = ВложенныйЗапрос2.Номенклатура
                   И ВложенныйЗапрос1.ХарактеристикаНоменклатуры = ВложенныйЗапрос2.ХарактеристикаНоменклатуры
                   И ВложенныйЗапрос1.СерияНоменклатуры = ВложенныйЗапрос2.СерияНоменклатуры
       
       СГРУППИРОВАТЬ ПО
           ВложенныйЗапрос1.Номенклатура,
           ВложенныйЗапрос1.ХарактеристикаНоменклатуры,
           ВложенныйЗапрос1.СерияНоменклатуры) КАК ТоварыВРейсах
       ПО ТоварыКРаспределениюПоРейсамОстатки.Номенклатура = ТоварыВРейсах.Номенклатура
           И ТоварыКРаспределениюПоРейсамОстатки.ХарактеристикаНоменклатуры = ТоварыВРейсах.ХарактеристикаНоменклатуры
           И ТоварыКРаспределениюПоРейсамОстатки.СерияНоменклатуры = ТоварыВРейсах.СерияНоменклатуры
       
ГДЕ
   ТоварыКРаспределениюПоРейсамОстатки.КоличествоОстаток > 0
УПОРЯДОЧИТЬ ПО
 Регион, КонтрагентНаименование
ИТОГИ
   СУММА(КоличествоКРаспределению),
   СУММА(Сумма),
   СУММА(Вес),
   СУММА(СуммаУпр),
   СУММА(Объем)
ПО
Регион, Контрагент,
   Заказ
14 Maxus43
 
12.04.12
14:22
на вскидку - Соединение с Вложенными - точно ЗЛО,
так же "РегистрНакопления.ТоварыНаСкладах.Обороты(, , Регистратор" - ограничение периода где? есно долго.

ГДЕ
                   ТоварыНаСкладахОбороты.Регистратор ССЫЛКА Документ.ПеремещениеТоваров
в условия вирт таблицы надо, а не в ГДЕ
15 Maxus43
 
12.04.12
14:24
Вложеные запросы вынести в ВТ, проиндексировать по полям Соединения
16 mnail1979
 
12.04.12
14:24
вопрос - почему же обновление статистики не помогает?????
Вчера этот запрос летал, сегодня уже тормозит страшно
17 Эстет хренов
 
12.04.12
14:26
(0) "ТоварыКРаспределениюПоРейсамОстатки"
экспедиционный склад и товары в пути автоматизируете? это типовая или самописка?
18 Maxus43
 
12.04.12
14:26
(16) возможно как раз из-за вложенного запроса (соединения с ним). СУБД может выбрать неверный план, что сильно скажется на производительности
19 mnail1979
 
12.04.12
14:28
(17) это самописка
20 mnail1979
 
12.04.12
14:29
а нельзя никак заставить СУБД пойти по другому плану, пока я с ВТ буду разбираться
21 mnail1979
 
12.04.12
14:29
я сужу просто по ораклу. Там СУБД сама предлагает оптимальный план, чтобы временно выйти из ситуации. А то меня тут щас убивают
22 Эстет хренов
 
12.04.12
14:29
тут какая-то лажа, выборка без фильтров, непонятная стыковка:
РегистрНакопления.ТоварыВРейсах.Обороты(, , ,  Состояние <> &CостояниеРейсаЗакрыт ) КАК ТоварыВРейсахОбороты
Переделайте
23 Maxus43
 
12.04.12
14:29
(20) Нет, у оптимизатора СКЛ своё мнение, и на него не повлиять. косвенно влияет статистика, но уже обновляли её
24 Maxus43
 
12.04.12
14:31
(21) ну пишите сразу нормально запросы...
На ВТ передалть несложно, полностью Вложеный запрос копируем, пихаем в пакет запроса и индексируем поля нужные. всё делается в конструкторе
25 mnail1979
 
12.04.12
14:32
(24) не умею. Щас буду пробовать. У меня получится 2 ВТ?
26 Maxus43
 
12.04.12
14:33
поочереди всё делай, сначала один вынеси, потом второй
27 Maxus43
 
12.04.12
14:37
ВЫБРАТЬ
   Номенклатура.Код,
   Номенклатура.Наименование
ПОМЕСТИТЬ втНоменклатуры
ИЗ
   Справочник.Номенклатура КАК Номенклатура
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   втНоменклатуры.Код,
   втНоменклатуры.Наименование
ИЗ
   втНоменклатуры КАК втНоменклатуры

Выглядит в примитиве так.
в первые пакеты выносиш Вложенные запросы, пока не изменяя текст исходного запроса. Потом просто ПКМ - Заменить Таблицу, т.к. поля одинаковые и в ВТ и во вложеном - заменит без проблем, в ВТ индексируй по полям с условиями и соединениями
28 mnail1979
 
12.04.12
14:42
пытаюсь понять, насколько сильно мне его делить. У меня там по ходу кроме вложенныйзапрос1 и вложенныйзапрос2 есть еще другие вложенные. Ведь так?
29 dmpl
 
12.04.12
14:47
(13) Убери левые соединения, используй ОБЪЕДИНИТЬ ВСЕ и СГРУППИРОВАТЬ, как минимум для таблиц ТоварыНаСкладахОстатки и ТоварыВРейсах.
30 mnail1979
 
12.04.12
14:54
(24) в новый пакет запроса вставляю вложенный запрос - он почему то весь запрос переделывает
31 dmpl
 
12.04.12
14:56
(13) И вообще, рекомендация на будущее: следует избегать левого(правого и т.п.) соединения для получения суммируемых полей. В противном случае стоит немного недоглядеть - и получишь удвоение сумм из-за привязки "одна запись левой таблицы - несколько записей правой таблицы". Отловить это крайне непросто бывает, а уж когда у начальства цифры не сойдутся, оно явно не радо будет.
32 Fragster
 
гуру
12.04.12
14:59
ТоварыНаСкладахОбороты.Регистратор.СкладПолучатель.ТипСклада = &СкладМашина - Вы издеваетесь? И это еще и во 2-м вложенном запросе в условии соеднения...
33 mnail1979
 
12.04.12
15:01
помогите плиз исправить код правильно. Нужно срочно, а времени изучить ВТ щас нету. Обещаю изучить завтра :)
Вот код исходника

Функция ЗаполнитьДеревоЗаказов(Кнопка,Все,ЗаказНачПериода,ЗаказКонПериода,ЕстьФильтрПоСпискуНоменклатуры,ФильтрСписокНоменклатуры,ЕстьСписокОрдертейкеров,ФильтрСписокОрдертейкеров,МТекущийРейс) Экспорт
   
   Сорт = ?(Кнопка = "Регион" ,"Регион, Контрагент","Контрагент, Регион");
   СортПорядок = ?(Кнопка = "Контрагент","КонтрагентНаименование,Регион",?(Кнопка = "Регион","Регион, КонтрагентНаименование","КодОракл,Регион"));
//    СортПорядок = ?(Кнопка = "Контрагент","КонтрагентНаименование,РегионНаименование",?(Кнопка = "Регион","РегионНаименование, КонтрагентНаименование","КодОракл,РегионНаименование"));
   
   ФильтрТоварыВРейсах = " Состояние <> &CостояниеРейсаЗакрыт ";
   ФильтрТоварыКРаспределениюПоРейсам = "";
       
   Если Все <> "" Тогда
       ФильтрТоварыКРаспределениюПоРейсам = " Номенклатура.ЭтоСпецНоменклатура = " + Все;  
   КонецЕсли;
   Если ЗначениеЗаполнено(ЗаказНачПериода) Тогда
       ФильтрТоварыКРаспределениюПоРейсам = ФильтрТоварыКРаспределениюПоРейсам + ?(ФильтрТоварыКРаспределениюПоРейсам = "", "", " и ") + " ЗаказПокупателя.ДатаОтгрузки >= &ЗаказПокупателяДатаНачала ";
   КонецЕсли;
   Если ЗначениеЗаполнено(ЗаказКонПериода) Тогда
       ФильтрТоварыКРаспределениюПоРейсам = ФильтрТоварыКРаспределениюПоРейсам + ?(ФильтрТоварыКРаспределениюПоРейсам = "", "", " и ") + " ЗаказПокупателя.ДатаОтгрузки <= &ЗаказПокупателяДатаКонца ";
   КонецЕсли;
   Если ЕстьФильтрПоСпискуНоменклатуры и ФильтрСписокНоменклатуры.Количество() > 0 Тогда
       ФильтрТоварыКРаспределениюПоРейсам = ФильтрТоварыКРаспределениюПоРейсам + ?(ФильтрТоварыКРаспределениюПоРейсам = "", "", " и ") + " Номенклатура в ИЕРАРХИИ(&СписокНоменклатуры) ";
   КонецЕсли;  
   
   Если ЕстьСписокОрдертейкеров и ФильтрСписокОрдертейкеров.Количество()>0 Тогда
        ФильтрТоварыКРаспределениюПоРейсам = ФильтрТоварыКРаспределениюПоРейсам + ?(ФильтрТоварыКРаспределениюПоРейсам = "", "", " и ") + " ВЫБОР КОГДА ЗаказПокупателя.Грузополучатель=ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка) Тогда ЗаказПокупателя.Контрагент.Ордертейкер ИНАЧЕ ЗаказПокупателя.Грузополучатель.Ордертейкер Конец  в ИЕРАРХИИ(&Ордертейкер) ";
   КонецЕсли;  

   
   Запрос = Новый Запрос;
   Запрос.УстановитьПараметр("ЗаказПокупателяДатаНачала", Началодня(ЗаказНачПериода));
   Запрос.УстановитьПараметр("ЗаказПокупателяДатаКонца",  КонецДня(ЗаказКонПериода));
   Запрос.УстановитьПараметр("СписокНоменклатуры", ФильтрСписокНоменклатуры.ВыгрузитьКолонку("Номенклатура"));
   Запрос.УстановитьПараметр("Ордертейкер",ФильтрСписокОрдертейкеров.ВыгрузитьКолонку("Ордертейкеры"));
   Запрос.Текст =
   "ВЫБРАТЬ
   |    ТоварыКРаспределениюПоРейсамОстатки.ЗаказПокупателя.Контрагент.КодОракл КАК КодОракл,
   |    ВЫБОР КОГДА ТоварыКРаспределениюПоРейсамОстатки.ЗаказПокупателя.Грузополучатель=ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка) ТОГДА ТоварыКРаспределениюПоРейсамОстатки.ЗаказПокупателя.Контрагент.Регион ИНАЧЕ ТоварыКРаспределениюПоРейсамОстатки.ЗаказПокупателя.Грузополучатель.Регион КОНЕЦ КАК Регион,
//    |    ЕстьNULL(ТоварыКРаспределениюПоРейсамОстатки.ЗаказПокупателя.Грузополучатель.Регион.Наименование, ТоварыКРаспределениюПоРейсамОстатки.ЗаказПокупателя.Контрагент.Регион.Наименование) КАК РегионНаименование,
   |    ТоварыКРаспределениюПоРейсамОстатки.ЗаказПокупателя.Контрагент КАК Контрагент,
   |    ТоварыКРаспределениюПоРейсамОстатки.ЗаказПокупателя.Контрагент.Наименование КАК КонтрагентНаименование,
   |    ТоварыКРаспределениюПоРейсамОстатки.ЗаказПокупателя КАК Заказ,
   |    ТоварыКРаспределениюПоРейсамОстатки.Номенклатура,
   |    ТоварыКРаспределениюПоРейсамОстатки.ХарактеристикаНоменклатуры,
   |    ТоварыКРаспределениюПоРейсамОстатки.СерияНоменклатуры,
   |    ТоварыКРаспределениюПоРейсамОстатки.ЕдиницаИзмерения,
   |    ТоварыКРаспределениюПоРейсамОстатки.ТипПоставки,
   |    ТоварыКРаспределениюПоРейсамОстатки.Цена,
   |    ТоварыКРаспределениюПоРейсамОстатки.СтавкаНДС,
   |    ТоварыКРаспределениюПоРейсамОстатки.КоличествоОстаток КАК КоличествоКРаспределению,
   |    ТоварыКРаспределениюПоРейсамОстатки.СуммаВзаиморасчетовОстаток КАК Сумма,
   |    ТоварыКРаспределениюПоРейсамОстатки.ЕдиницаИзмерения.Вес * ТоварыКРаспределениюПоРейсамОстатки.КоличествоОстаток / ТоварыКРаспределениюПоРейсамОстатки.ЕдиницаИзмерения.Коэффициент *ТоварыКРаспределениюПоРейсамОстатки.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент КАК Вес,
   |    ТоварыКРаспределениюПоРейсамОстатки.СуммаУпрОстаток КАК СуммаУпр,
   |    ТоварыКРаспределениюПоРейсамОстатки.ЕдиницаИзмерения.Объем * ТоварыКРаспределениюПоРейсамОстатки.КоличествоОстаток / ТоварыКРаспределениюПоРейсамОстатки.ЕдиницаИзмерения.Коэффициент *ТоварыКРаспределениюПоРейсамОстатки.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент КАК Объем,
   |    ТоварыКРаспределениюПоРейсамОстатки.ЗаказПокупателя.Дата,
   |    ТоварыКРаспределениюПоРейсамОстатки.ЗаказПокупателя.Номер,
   |    ЕСТЬNULL(ТоварыНаСкладахОстатки.КоличествоОстаток, 0) - ЕСТЬNULL(ТоварыВРейсах.КоличествоОборот, 0) КАК КоличествоОстаток
   |    ИЗ
   |    РегистрНакопления.ТоварыКРаспределениюПоРейсам.Остатки(&Дата, " + ФильтрТоварыКРаспределениюПоРейсам + ") КАК ТоварыКРаспределениюПоРейсамОстатки
   |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(&ДатаРейс, Склад.ТипСклада <> &СкладМашина) КАК ТоварыНаСкладахОстатки
   |        ПО ТоварыКРаспределениюПоРейсамОстатки.Номенклатура = ТоварыНаСкладахОстатки.Номенклатура
   |            И ТоварыКРаспределениюПоРейсамОстатки.ХарактеристикаНоменклатуры = ТоварыНаСкладахОстатки.ХарактеристикаНоменклатуры
   |            И ТоварыКРаспределениюПоРейсамОстатки.СерияНоменклатуры = ТоварыНаСкладахОстатки.СерияНоменклатуры
   |        ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
   |            СУММА(ВЫБОР
   |                    КОГДА ВложенныйЗапрос1.КоличествоОборот - ЕСТЬNULL(ВложенныйЗапрос2.КоличествоПриход, 0) > 0
   |                        ТОГДА ВложенныйЗапрос1.КоличествоОборот - ЕСТЬNULL(ВложенныйЗапрос2.КоличествоПриход, 0)
   |                    ИНАЧЕ 0
   |                КОНЕЦ) КАК КоличествоОборот,
   |            ВложенныйЗапрос1.Номенклатура КАК Номенклатура,
   |            ВложенныйЗапрос1.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
   |            ВложенныйЗапрос1.СерияНоменклатуры КАК СерияНоменклатуры
   |        ИЗ
   |            (ВЫБРАТЬ
   |               ТоварыВРейсахОбороты.Рейс КАК Рейс,
   |                ТоварыВРейсахОбороты.Номенклатура КАК Номенклатура,
   |                ТоварыВРейсахОбороты.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
   |                ТоварыВРейсахОбороты.СерияНоменклатуры КАК СерияНоменклатуры,
   |                СУММА(ЕСТЬNULL(ТоварыВРейсахОбороты.КоличествоОборот, 0)) КАК КоличествоОборот
   |            ИЗ
   |                РегистрНакопления.ТоварыВРейсах.Обороты(, , , " + ФильтрТоварыВРейсах + ") КАК ТоварыВРейсахОбороты
   |            
   |            СГРУППИРОВАТЬ ПО
   |               ТоварыВРейсахОбороты.Рейс,
   |                ТоварыВРейсахОбороты.Номенклатура,
   |                ТоварыВРейсахОбороты.ХарактеристикаНоменклатуры,
   |                ТоварыВРейсахОбороты.СерияНоменклатуры) КАК ВложенныйЗапрос1
   |                ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
   |                    ТоварыНаСкладахОбороты.Номенклатура КАК Номенклатура,
   |                    ТоварыНаСкладахОбороты.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
   |                    ТоварыНаСкладахОбороты.СерияНоменклатуры КАК СерияНоменклатуры,
   |                    ТоварыНаСкладахОбороты.Регистратор.Рейс КАК РегистраторРейс,
   |                    СУММА(ТоварыНаСкладахОбороты.КоличествоПриход) КАК КоличествоПриход
   |                ИЗ
   |                    РегистрНакопления.ТоварыНаСкладах.Обороты(, , Регистратор, Склад.ТипСклада = &СкладМашина) КАК ТоварыНаСкладахОбороты
   |                ГДЕ
   |                    ТоварыНаСкладахОбороты.Регистратор ССЫЛКА Документ.ПеремещениеТоваров
   |                    И ТоварыНаСкладахОбороты.Регистратор.СкладПолучатель.ТипСклада = &СкладМашина
   |                                        
   |                СГРУППИРОВАТЬ ПО
   |                    ТоварыНаСкладахОбороты.Номенклатура,
   |                    ТоварыНаСкладахОбороты.ХарактеристикаНоменклатуры,
   |                    ТоварыНаСкладахОбороты.СерияНоменклатуры,
   |                    ТоварыНаСкладахОбороты.Регистратор.Рейс) КАК ВложенныйЗапрос2
   |                ПО ВложенныйЗапрос1.Рейс = ВложенныйЗапрос2.РегистраторРейс
   |                    И ВложенныйЗапрос1.Номенклатура = ВложенныйЗапрос2.Номенклатура
   |                    И ВложенныйЗапрос1.ХарактеристикаНоменклатуры = ВложенныйЗапрос2.ХарактеристикаНоменклатуры
   |                    И ВложенныйЗапрос1.СерияНоменклатуры = ВложенныйЗапрос2.СерияНоменклатуры
   |        
   |        СГРУППИРОВАТЬ ПО
   |            ВложенныйЗапрос1.Номенклатура,
   |            ВложенныйЗапрос1.ХарактеристикаНоменклатуры,
   |            ВложенныйЗапрос1.СерияНоменклатуры) КАК ТоварыВРейсах
   |        ПО ТоварыКРаспределениюПоРейсамОстатки.Номенклатура = ТоварыВРейсах.Номенклатура
   |            И ТоварыКРаспределениюПоРейсамОстатки.ХарактеристикаНоменклатуры = ТоварыВРейсах.ХарактеристикаНоменклатуры
   |            И ТоварыКРаспределениюПоРейсамОстатки.СерияНоменклатуры = ТоварыВРейсах.СерияНоменклатуры
   |        
   |ГДЕ
   |    ТоварыКРаспределениюПоРейсамОстатки.КоличествоОстаток > 0
   |УПОРЯДОЧИТЬ ПО
   |  " + СортПорядок + "
   |ИТОГИ
   |    СУММА(КоличествоКРаспределению),
   |    СУММА(Сумма),
   |    СУММА(Вес),
   |    СУММА(СуммаУпр),
   |    СУММА(Объем)
   |ПО
   | " + Сорт + ",
   |    Заказ";
   Запрос.УстановитьПараметр("СкладМашина",Перечисления.ТипыСкладов.Машина);
   //Запрос.УстановитьПараметр("ПустаяСсылка" , Документы.Рейс.ПустаяСсылка());
   Запрос.УстановитьПараметр("Дата",КонецДня(Дата));
       // *F* Комкон #
   Запрос.УстановитьПараметр("ДатаРейс",КонецДня(Дата));
   // *F* Комкон )
   Запрос.УстановитьПараметр("CостояниеРейсаЗакрыт",Перечисления.СостояниеРейса.Закрыт);
   //Запрос.УстановитьПараметр("Истина",Истина);

           
   Возврат ЗАпрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам);

КонецФункции
34 Fragster
 
гуру
12.04.12
15:02
(33) автор, наточи пилу
35 Fragster
 
гуру
12.04.12
15:02
а вообще - 1000 руб.
36 Axel2009
 
12.04.12
15:02
ВЫБРАТЬ
                   ТоварыНаСкладахОбороты.Номенклатура КАК Номенклатура,
                   ТоварыНаСкладахОбороты.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
                  ТоварыНаСкладахОбороты.СерияНоменклатуры КАК СерияНоменклатуры,
+ Code
                   ТоварыНаСкладахОбороты.Регистратор.Рейс КАК РегистраторРейс,
                   СУММА(ТоварыНаСкладахОбороты.КоличествоПриход) КАК КоличествоПриход
               ИЗ
                   РегистрНакопления.ТоварыНаСкладах.Обороты(, , Регистратор, Склад.ТипСклада = &СкладМашина) КАК ТоварыНаСкладахОбороты
               ГДЕ
                   ТоварыНаСкладахОбороты.Регистратор ССЫЛКА Документ.ПеремещениеТоваров
                   И ТоварыНаСкладахОбороты.Регистратор.СкладПолучатель.ТипСклада = &СкладМашина
                                       
               СГРУППИРОВАТЬ ПО
                   ТоварыНаСкладахОбороты.Номенклатура,
                   ТоварыНаСкладахОбороты.ХарактеристикаНоменклатуры,
                   ТоварыНаСкладахОбороты.СерияНоменклатуры,
                   ТоварыНаСкладахОбороты.Регистратор.Рейс
вот эту фигню переделать без виртуальной таблицы. и то работать будет быстрее. плюс выразить в запросе не забыть использовать
37 dmpl
 
12.04.12
15:03
(33) Да не обязательно тут временные таблицы использовать - достаточно убрать левые соединения.
38 mnail1979
 
12.04.12
15:06
(37) зачем убирать левые соединения, если они работают правильно
У меня тормозит строка  ЕСТЬNULL(ТоварыНаСкладахОстатки.КоличествоОстаток, 0) - ЕСТЬNULL(ТоварыВРейсах.КоличествоОборот, 0) КАК КоличествоОстаток

Без нее все работает отлично
39 Fragster
 
гуру
12.04.12
15:07
(38) так без нее у тебя из регистров не получаются данные, ВТ сука умные
40 mnail1979
 
12.04.12
15:08
кстати, вы везде упоминаете ВТ - это что, менеджер временных таблиц.
Т.е.мне надо разбить это запрос на много маленьких запросов, и через менеджер временных таблиц все соединять?
41 Fragster
 
гуру
12.04.12
15:10
есть вт как "виртуальные" таблицы а есть как "временные"
42 dmpl
 
12.04.12
15:11
(38) Затем, что левые соединения без правильных индексов - очень тормозная штука. И в данном случае нет смысла их использовать столько раз.
43 mnail1979
 
12.04.12
15:12
(41) и что подразумевается в данном случае? Мне нужно делать что то типа Запрос.МенеджерВременныхТаблиц=Новый МенеджерВременныхТаблиц;
или все же везде идет речь о виртуальных таблицах
44 mnail1979
 
12.04.12
15:13
(42) и на что можно заменить левые соединения?
может кто нибудь переделать исходник по вышеупомянутым рекомендациям?
45 mnail1979
 
12.04.12
15:17
(15) в вашем случае под ВТ вы что понимаете, временные или виртуальные.
46 dmpl
 
12.04.12
15:19
(44) Пример:


ВЫБРАТЬ
   Номенклатура,
   Количество
ИЗ
   РегистрНакопления.ТоварыВРейсах

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
   Номенклатура,
   -Количество
ИЗ
   РегистрНакопления.ТоварыНаСкладах


Далее просто группируешь как надо.

Если хочешь использовать ее как временную таблицу, то просто делаешь так


ВЫБРАТЬ
   Номенклатура,
   Количество
ПОМЕСТИТЬ ВТТоварыВРейсахИОстатки
ИЗ
   РегистрНакопления.ТоварыВРейсах

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
   Номенклатура,
   -Количество
ИЗ
   РегистрНакопления.ТоварыНаСкладах
;

ВЫБРАТЬ
   Номенклатура,
   Количество
ИЗ
   ВТТоварыВРейсахИОстатки
47 Maxus43
 
12.04.12
15:20
(45) я? Временные, как в примере (27). ПОМЕСТИТЬ - делает врем таб, без всяких Запрос.МенеджерВременныхТаблиц=Новый МенеджерВременныхТаблиц.

Виртуальные - это у регистров, например Остатки - виртуальная таблица
48 Ranger_83
 
12.04.12
15:21
>>Запускаю обработку, в которой сидит этот запрос - запрос срабатывает >>почти за 3 минуты.
>>Запускаю этот запрос в консоле отчетов - проходит моментально.
Предлагаю сделать замер производительности чтобы снять все вопросы относительно корректности запроса.
49 Ranger_83
 
12.04.12
15:22
Я как то бился над запросом в динамическом списке УФ,а оказалось тормозит сам вывод на форму,а не запрос:)
50 mnail1979
 
12.04.12
15:30
я не знал, что в запросе можно писать несколько запросов, разделенных ;
51 mnail1979
 
12.04.12
15:31
(27) а что такое ПКМ?
52 Maxus43
 
12.04.12
15:31
(51) ПраваКнопкаМыши на таблице, там есть пункт заменить таблицу
53 mnail1979
 
12.04.12
15:34
(52) :))
54 mnail1979
 
12.04.12
15:39
(48) интересно. В консоле отчетов сохранил запрос. На старом серваке запрос идет где то секунд 20 - это и понятно - железо очень слабое.
На новом серваке - 2 секунды. Но на новом серваке в приложении этот запрос срабатывает очень долго
55 Ranger_83
 
12.04.12
15:59
(54)Ты замером производительности штатным пользуйся в конфигураторе.Как замер сделаешь,результаты в студию
56 Ranger_83
 
12.04.12
16:01
(55)+замеряй работу обработки от формирования запроса до вывода информации
57 mnail1979
 
12.04.12
16:13
получил такой запрос:

ВЫБРАТЬ
   ТоварыНаСкладахОбороты.Номенклатура КАК Номенклатура,
   ТоварыНаСкладахОбороты.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
   ТоварыНаСкладахОбороты.СерияНоменклатуры КАК СерияНоменклатуры,
   ТоварыНаСкладахОбороты.Регистратор.Рейс КАК РегистраторРейс,
   СУММА(ТоварыНаСкладахОбороты.КоличествоПриход) КАК КоличествоПриход
ПОМЕСТИТЬ ВТТоварыНаСкладахОбороты
ИЗ
   РегистрНакопления.ТоварыНаСкладах.Обороты(, , Регистратор, Склад.ТипСклада = &СкладМашина) КАК ТоварыНаСкладахОбороты
ГДЕ
   ТоварыНаСкладахОбороты.Регистратор ССЫЛКА Документ.ПеремещениеТоваров
   И ТоварыНаСкладахОбороты.Регистратор.СкладПолучатель.ТипСклада = &СкладМашина

СГРУППИРОВАТЬ ПО
   ТоварыНаСкладахОбороты.Номенклатура,
   ТоварыНаСкладахОбороты.ХарактеристикаНоменклатуры,
   ТоварыНаСкладахОбороты.СерияНоменклатуры,
   ТоварыНаСкладахОбороты.Регистратор.Рейс

ИНДЕКСИРОВАТЬ ПО
   Номенклатура,
   ХарактеристикаНоменклатуры,
   СерияНоменклатуры,
   РегистраторРейс
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ТоварыВРейсахОбороты.Рейс КАК Рейс,
   ТоварыВРейсахОбороты.Номенклатура КАК Номенклатура,
   ТоварыВРейсахОбороты.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
   ТоварыВРейсахОбороты.СерияНоменклатуры КАК СерияНоменклатуры,
   СУММА(ЕСТЬNULL(ТоварыВРейсахОбороты.КоличествоОборот, 0)) КАК КоличествоОборот
ПОМЕСТИТЬ ВТТоварыВРейсахОбороты
ИЗ
   РегистрНакопления.ТоварыВРейсах.Обороты(, , , Состояние <> &CостояниеРейсаЗакрыт) КАК ТоварыВРейсахОбороты

СГРУППИРОВАТЬ ПО
   ТоварыВРейсахОбороты.Рейс,
   ТоварыВРейсахОбороты.Номенклатура,
   ТоварыВРейсахОбороты.ХарактеристикаНоменклатуры,
   ТоварыВРейсахОбороты.СерияНоменклатуры

ИНДЕКСИРОВАТЬ ПО
   Рейс,
   Номенклатура,
   ХарактеристикаНоменклатуры,
   СерияНоменклатуры
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   СУММА(ВЫБОР
           КОГДА ВТТоварыВРейсахОбороты.КоличествоОборот - ЕСТЬNULL(ВТТоварыНаСкладахОбороты.КоличествоПриход, 0) > 0
               ТОГДА ВТТоварыВРейсахОбороты.КоличествоОборот - ЕСТЬNULL(ВТТоварыНаСкладахОбороты.КоличествоПриход, 0)
           ИНАЧЕ 0
       КОНЕЦ) КАК КоличествоОборот,
   ВТТоварыВРейсахОбороты.Номенклатура КАК Номенклатура,
   ВТТоварыВРейсахОбороты.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
   ВТТоварыВРейсахОбороты.СерияНоменклатуры КАК СерияНоменклатуры
ПОМЕСТИТЬ ВТТоварыВРейсах
ИЗ
   ВТТоварыВРейсахОбороты КАК ВТТоварыВРейсахОбороты
       ЛЕВОЕ СОЕДИНЕНИЕ ВТТоварыНаСкладахОбороты КАК ВТТоварыНаСкладахОбороты
       ПО ВТТоварыВРейсахОбороты.Рейс = ВТТоварыНаСкладахОбороты.РегистраторРейс
           И ВТТоварыВРейсахОбороты.Номенклатура = ВТТоварыНаСкладахОбороты.Номенклатура
           И ВТТоварыВРейсахОбороты.ХарактеристикаНоменклатуры = ВТТоварыНаСкладахОбороты.ХарактеристикаНоменклатуры
           И ВТТоварыВРейсахОбороты.СерияНоменклатуры = ВТТоварыНаСкладахОбороты.СерияНоменклатуры

СГРУППИРОВАТЬ ПО
   ВТТоварыВРейсахОбороты.Номенклатура,
   ВТТоварыВРейсахОбороты.ХарактеристикаНоменклатуры,
   ВТТоварыВРейсахОбороты.СерияНоменклатуры

ИНДЕКСИРОВАТЬ ПО
   КоличествоОборот,
   Номенклатура,
   ХарактеристикаНоменклатуры,
   СерияНоменклатуры
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ТоварыКРаспределениюПоРейсамОстатки.ЗаказПокупателя.Контрагент.КодОракл КАК КодОракл,
   ВЫБОР
       КОГДА ТоварыКРаспределениюПоРейсамОстатки.ЗаказПокупателя.Грузополучатель = ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)
           ТОГДА ТоварыКРаспределениюПоРейсамОстатки.ЗаказПокупателя.Контрагент.Регион
       ИНАЧЕ ТоварыКРаспределениюПоРейсамОстатки.ЗаказПокупателя.Грузополучатель.Регион
   КОНЕЦ КАК Регион,
   ТоварыКРаспределениюПоРейсамОстатки.ЗаказПокупателя.Контрагент КАК Контрагент,
   ТоварыКРаспределениюПоРейсамОстатки.ЗаказПокупателя.Контрагент.Наименование КАК КонтрагентНаименование,
   ТоварыКРаспределениюПоРейсамОстатки.ЗаказПокупателя КАК Заказ,
   ТоварыКРаспределениюПоРейсамОстатки.Номенклатура,
   ТоварыКРаспределениюПоРейсамОстатки.ХарактеристикаНоменклатуры,
   ТоварыКРаспределениюПоРейсамОстатки.СерияНоменклатуры,
   ТоварыКРаспределениюПоРейсамОстатки.ЕдиницаИзмерения,
   ТоварыКРаспределениюПоРейсамОстатки.ТипПоставки,
   ТоварыКРаспределениюПоРейсамОстатки.Цена,
   ТоварыКРаспределениюПоРейсамОстатки.СтавкаНДС,
   ТоварыКРаспределениюПоРейсамОстатки.КоличествоОстаток КАК КоличествоКРаспределению,
   ТоварыКРаспределениюПоРейсамОстатки.СуммаВзаиморасчетовОстаток КАК Сумма,
   ТоварыКРаспределениюПоРейсамОстатки.ЕдиницаИзмерения.Вес * ТоварыКРаспределениюПоРейсамОстатки.КоличествоОстаток / ТоварыКРаспределениюПоРейсамОстатки.ЕдиницаИзмерения.Коэффициент * ТоварыКРаспределениюПоРейсамОстатки.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент КАК Вес,
   ТоварыКРаспределениюПоРейсамОстатки.СуммаУпрОстаток КАК СуммаУпр,
   ТоварыКРаспределениюПоРейсамОстатки.ЕдиницаИзмерения.Объем * ТоварыКРаспределениюПоРейсамОстатки.КоличествоОстаток / ТоварыКРаспределениюПоРейсамОстатки.ЕдиницаИзмерения.Коэффициент * ТоварыКРаспределениюПоРейсамОстатки.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент КАК Объем,
   ТоварыКРаспределениюПоРейсамОстатки.ЗаказПокупателя.Дата,
   ТоварыКРаспределениюПоРейсамОстатки.ЗаказПокупателя.Номер,
   ЕСТЬNULL(ТоварыНаСкладахОстатки.КоличествоОстаток, 0) - ЕСТЬNULL(ВТТоварыВРейсах.КоличествоОборот, 0) КАК КоличествоОстаток
ИЗ
   РегистрНакопления.ТоварыКРаспределениюПоРейсам.Остатки(
           &Дата,
           ЗаказПокупателя.ДатаОтгрузки >= &ЗаказПокупателяДатаНачала
               И ЗаказПокупателя.ДатаОтгрузки <= &ЗаказПокупателяДатаКонца) КАК ТоварыКРаспределениюПоРейсамОстатки
       ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(&ДатаРейс, Склад.ТипСклада <> &СкладМашина) КАК ТоварыНаСкладахОстатки
       ПО ТоварыКРаспределениюПоРейсамОстатки.Номенклатура = ТоварыНаСкладахОстатки.Номенклатура
           И ТоварыКРаспределениюПоРейсамОстатки.ХарактеристикаНоменклатуры = ТоварыНаСкладахОстатки.ХарактеристикаНоменклатуры
           И ТоварыКРаспределениюПоРейсамОстатки.СерияНоменклатуры = ТоварыНаСкладахОстатки.СерияНоменклатуры
       ЛЕВОЕ СОЕДИНЕНИЕ ВТТоварыВРейсах КАК ВТТоварыВРейсах
       ПО ТоварыКРаспределениюПоРейсамОстатки.Номенклатура = ВТТоварыВРейсах.Номенклатура
           И ТоварыКРаспределениюПоРейсамОстатки.ХарактеристикаНоменклатуры = ВТТоварыВРейсах.ХарактеристикаНоменклатуры
           И ТоварыКРаспределениюПоРейсамОстатки.СерияНоменклатуры = ВТТоварыВРейсах.СерияНоменклатуры
ГДЕ
   ТоварыКРаспределениюПоРейсамОстатки.КоличествоОстаток > 0

УПОРЯДОЧИТЬ ПО
   Регион,
   КонтрагентНаименование
ИТОГИ
   СУММА(КоличествоКРаспределению),
   СУММА(Сумма),
   СУММА(Вес),
   СУММА(СуммаУпр),
   СУММА(Объем)
ПО
   Регион,
   Контрагент,
   Заказ
58 ilya_i
 
12.04.12
16:24
замени
"ТоварыНаСкладахОбороты.Регистратор."
на
"Выразить(ТоварыНаСкладахОбороты.Регистратор как Документ.ПеремещениеТоваров)."
именно где точка. Хотя бы в первом запросе.
59 ilya_i
 
12.04.12
16:27
а это что за бред:
ЗаказПокупателя.ДатаОтгрузки >= &ЗаказПокупателяДатаНачала
               И ЗаказПокупателя.ДатаОтгрузки <= &ЗаказПокупателяДатаКонца
почему не "Между"
60 mnail1979
 
12.04.12
16:44
спасибо всем. Все заработало
61 mnail1979
 
12.04.12
16:45
(58) а зачем?
62 Axel2009
 
12.04.12
16:51
(61) затем что на порядочек еще увеличится скорость
63 dmpl
 
12.04.12
16:52
(61) Если у регистратора несколько типов - то при использовании доступа через точку сервер автоматом цепляет к запросу несколько таблиц документов (по одной на каждый тип). ВЫРАЗИТЬ приводит к тому, что цепляется только одна таблица - того типа, который стоит в выразить. Но вообще, правильнее такое поле добавить в регистр.
64 Maxus43
 
12.04.12
16:55
(62) на скорость это мало влияет (если несколько документов например, если тип Любаяссылка - то да, просто зависнет нафиг), влияет на результат, правильно типизированый
65 Fragster
 
гуру
12.04.12
20:08
(64) ну-ну