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