|
Медленная работа запроса | ☑ | ||
---|---|---|---|---|
0
Lepochkin
09.10.12
✎
11:06
|
Имеем следующий запрос
ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ | Остатки.Номенклатура.Наименование КАК Наименование, | Остатки.Номенклатура, | Остатки.Номенклатура.Код КАК Код, | Остатки.Номенклатура.НоменклатурнаяГруппа КАК Номенклатурнаягруппа, | Остатки.Номенклатура.КолФас КАК КолвоУпак, | Остатки.КоличествоОстаток - ЕСТЬNULL(Резервы.КоличествоОстаток, 0) КАК Остаток, | &Коэффициент * срез.Цена КАК Цена, | ЕСТЬNULL(МинимальныеПартии.Количество, 0) КАК МинимальнаяПартия |ИЗ | РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата, Склад = &Склад) КАК Остатки | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата, ТипЦен = &ТипЦены) КАК срез | ПО Остатки.Номенклатура = срез.Номенклатура | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ИНМинимальныеПартии КАК МинимальныеПартии | ПО (МинимальныеПартии.Номенклатура = Остатки.Номенклатура) | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыВРезервеНаСкладах.Остатки(&Дата, ДокументРезерва.Контрагент <> &Контрагент) КАК Резервы | ПО Остатки.Номенклатура = Резервы.Номенклатура | |УПОРЯДОЧИТЬ ПО | Наименование Он вызывается при открытии одной обработки. Дак вот. При открытии обработки он почему-то выполняется примерно 30 секунд, а если я этот запрос делаю в консоли запросов, то примерно 2 секунды. Откуда такая разница в производительности??? |
|||
1
DrShad
09.10.12
✎
11:07
|
точно именно запрос или все таки обработка результата тормозит?
|
|||
2
Lepochkin
09.10.12
✎
11:09
|
Результат = Запрос.Выполнить(); //99.6% времени выполнения
НоменклатураДляПодбора.Загрузить(Результат.Выгрузить()); |
|||
3
DrShad
09.10.12
✎
11:10
|
НоменклатураДляПодбора.Загрузить(Результат.Выгрузить());
а это сколько? |
|||
4
Lepochkin
09.10.12
✎
11:12
|
НоменклатураДляПодбора - табличная часть обработки
|
|||
5
Lepochkin
09.10.12
✎
11:12
|
(3)0,03%. за (4) сорри не так прочитал
|
|||
6
DrShad
09.10.12
✎
11:14
|
и эта разница под одним юзером?
|
|||
7
Lepochkin
09.10.12
✎
11:14
|
ага
|
|||
8
DrShad
09.10.12
✎
11:15
|
странно, но проверить не на чем ибо у тебя конфа не типовая уже
|
|||
9
Fragster
гуру
09.10.12
✎
11:15
|
перенести все виртуальные таблицы во временные
|
|||
10
hhhh
09.10.12
✎
11:16
|
(7) похоже вот эта фигня тормозит
ДокументРезерва.Контрагент <> &Контрагент попытайтесь избавиться от нее любым способом. |
|||
11
Fragster
гуру
09.10.12
✎
11:16
|
запрос в обработке в транзакции??
|
|||
12
chelentano
09.10.12
✎
11:16
|
(0) выбери сначала номенклатуру из остатков во временную таблицу, потом в виртуальных таблицах накладывай условие на номенклатуру
|
|||
13
Lepochkin
09.10.12
✎
11:21
|
(11) Нет. И честно у меня сомнения что выполнения запроса в транзакции даст прирост в скорости.
(7) Попробую как-нибудь... |
|||
14
Fragster
гуру
09.10.12
✎
11:23
|
(13) наоборот, выполнение запроса в транзакции замедляет
|
|||
15
GLazNik
09.10.12
✎
11:28
|
(0) разная скорость выполнения запроса в консоли и в обработке - не показатель. там кеши какие нить могут быть и прочее.
а вот оптимизировать запрос есть куда. например см (12). Кстати постепенно подключая таблицы можно будет понять где именно возникают тормаза. |
|||
16
Lepochkin
09.10.12
✎
11:30
|
(14)Ну у меня такое же мнение было.
(7) Пообщавшись с менеджерами выяснил, что резервный товар через эту обработку никто и не смотрит, потому переделал на ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыВРезервеНаСкладах.Остатки(&Дата) КАК Резервы Результат - 7 секунд. Весьма неплохо, но все равно в 2,5 раза дольше чем в консоли... |
|||
17
Lepochkin
09.10.12
✎
11:46
|
ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ
| ТоварыОстатки.Номенклатура КАК Номенклатура, | ТоварыОстатки.КоличествоОстаток |ПОМЕСТИТЬ Остатки |ИЗ | РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата, Склад = &Склад) КАК ТоварыОстатки |ИНДЕКСИРОВАТЬ ПО | ТоварыОстатки.Номенклатура; |//////////////////////////////////////////////// ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ | ЦеныНоменклатуры.Номенклатура КАК Номенклатура, | ЦеныНоменклатуры.Цена |ПОМЕСТИТЬ срез |ИЗ | РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата, ТипЦен = &ТипЦены) КАК ЦеныНоменклатуры |ИНДЕКСИРОВАТЬ ПО | ЦеныНоменклатуры.Номенклатура; ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ | Остатки.Номенклатура.Наименование КАК Наименование, | Остатки.Номенклатура, | Остатки.Номенклатура.Код КАК Код, | Остатки.Номенклатура.НоменклатурнаяГруппа КАК Номенклатурнаягруппа, | Остатки.Номенклатура.КолФас КАК КолвоУпак, | Остатки.КоличествоОстаток - ЕСТЬNULL(Резервы.КоличествоОстаток, 0) КАК Остаток, | &Коэффициент * срез.Цена КАК Цена, | ЕСТЬNULL(МинимальныеПартии.Количество, 0) КАК МинимальнаяПартия |ИЗ | Остатки КАК Остатки | ВНУТРЕННЕЕ СОЕДИНЕНИЕ срез КАК срез | ПО Остатки.Номенклатура = срез.Номенклатура | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ИНМинимальныеПартии КАК МинимальныеПартии | ПО (МинимальныеПартии.Номенклатура = Остатки.Номенклатура) | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыВРезервеНаСкладах.Остатки(&Дата) КАК Резервы | ПО Остатки.Номенклатура = Резервы.Номенклатура | |УПОРЯДОЧИТЬ ПО | Наименование Этот вариант работает значительно дольше |
|||
18
GLazNik
09.10.12
✎
11:49
|
(17) эмъ... а что мешает при формировании таблицы срез использовать только номенклатуру из остатки?
|
|||
19
Lepochkin
09.10.12
✎
11:51
|
(17)Человек может отгружать только с конкретного склада, так что срез в разрезе номенклатура-склад мне нужен
|
|||
20
Fragster
гуру
09.10.12
✎
11:54
|
обращение через две точки перенеси в первую таблицу
|
|||
21
Fragster
гуру
09.10.12
✎
11:56
|
(19) РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата, Номенклатура в (Выбрать Остатки.Номенклатура из Остатки) И ТипЦен = &ТипЦены)
|
|||
22
Fragster
гуру
09.10.12
✎
11:56
|
ну и товары в резерве тоже в ВТ.
|
|||
23
SUA
09.10.12
✎
12:01
|
(16)а вообще выкинуть тогда?
|
|||
24
Fragster
гуру
09.10.12
✎
12:02
|
а резервы тоже, наверное, в разрезе склада
|
|||
25
Lepochkin
09.10.12
✎
12:02
|
(23)Вообще выкинуть нельзя. Тогда резервы будут видны
|
|||
26
Lepochkin
09.10.12
✎
12:05
|
Конечный вариант. Более менее приемлемый.
ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ | ТоварыОстатки.Номенклатура КАК Номенклатура, | ТоварыОстатки.Номенклатура.Наименование КАК Наименование, | ТоварыОстатки.Номенклатура.Код КАК Код, | ТоварыОстатки.Номенклатура.НоменклатурнаяГруппа КАК НоменклатурнаяГруппа, | ТоварыОстатки.Номенклатура.КолФас КАК КолФас, | ТоварыОстатки.КоличествоОстаток |ПОМЕСТИТЬ Остатки |ИЗ | РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата, Склад = &Склад) КАК ТоварыОстатки |ИНДЕКСИРОВАТЬ ПО | ТоварыОстатки.Номенклатура; |//////////////////////////////////////////////// |ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ | ЦеныНоменклатуры.Номенклатура КАК Номенклатура, | ЦеныНоменклатуры.Цена |ПОМЕСТИТЬ срез |ИЗ | РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата,Номенклатура в (Выбрать Остатки.Номенклатура из Остатки) И ТипЦен = &ТипЦены) КАК ЦеныНоменклатуры |ИНДЕКСИРОВАТЬ ПО | ЦеныНоменклатуры.Номенклатура; |//////////////////////////////////////////////// |ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ | РезервыОстатки.Номенклатура КАК Номенклатура, | РезервыОстатки.КоличествоОстаток |ПОМЕСТИТЬ Резервы |ИЗ | РегистрНакопления.ТоварыВРезервеНаСкладах.Остатки(&Дата,Номенклатура в (Выбрать Остатки.Номенклатура из Остатки)) КАК РезервыОстатки |ИНДЕКСИРОВАТЬ ПО | РезервыОстатки.Номенклатура; |//////////////////////////////////////////////// |ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ | Остатки.Наименование КАК Наименование, | Остатки.Номенклатура, | Остатки.Код КАК Код, | Остатки.НоменклатурнаяГруппа КАК Номенклатурнаягруппа, | Остатки.КолФас КАК КолвоУпак, | Остатки.КоличествоОстаток - ЕСТЬNULL(Резервы.КоличествоОстаток, 0) КАК Остаток, | &Коэффициент * срез.Цена КАК Цена, | ЕСТЬNULL(МинимальныеПартии.Количество, 0) КАК МинимальнаяПартия |ИЗ | Остатки КАК Остатки | ВНУТРЕННЕЕ СОЕДИНЕНИЕ срез КАК срез | ПО Остатки.Номенклатура = срез.Номенклатура | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ИНМинимальныеПартии КАК МинимальныеПартии | ПО (МинимальныеПартии.Номенклатура = Остатки.Номенклатура) | ЛЕВОЕ СОЕДИНЕНИЕ Резервы КАК Резервы | ПО Остатки.Номенклатура = Резервы.Номенклатура | |УПОРЯДОЧИТЬ ПО | Наименование Если есть еще идеи по оптимизации буду рад выслушать |
|||
27
Fragster
гуру
09.10.12
✎
12:06
|
(26) резервы не по складу?
|
|||
29
akcent25
09.10.12
✎
12:10
|
(26)А здесь - РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата, Склад = &Склад) измерение Склад идет первым у регистра? Если нет, то его лучше проиндексировать.
|
|||
30
НЕА123
09.10.12
✎
12:11
|
НоменклатураДляПодбора.Загрузить(Запрос.Выполнить().Выгрузить());
|
|||
31
Александр_
Тверь 09.10.12
✎
12:12
|
а ты случайно обработку запускаешь не под другим пользователем?
А то как вариант у тебя полные права и нет RLS, а у пользователя под которым ты запускаешь - есть контроль RLS конструация "РАЗРЕШЕННЫЕ" указывает на то, что нужно выполнить дополнительную фильтрацию полученных данных в соответствии с RLs и это может вызывать существенное замедление. |
|||
32
Рыжий Лис
09.10.12
✎
12:17
|
(26) Убрать РАЗЛИЧНЫЕ
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |