|
Ускорить запрос с левым соединением | ☑ | ||
---|---|---|---|---|
0
antgrom
11.10.12
✎
18:01
|
v8
Розница Есть документ "Установка цен номенклатуры". На его основании я заполняю "Установка цен номенклатуры в магазине". Т.е. запросом получаю данные из документа УЦН и к нему два левых соединения к РС "Цены номенклатуры в магазине" для получения цен "по характеристикам" и "без характеристик". Оптимизировал и под конец получился какой-то монстр. Время выполнения запроса уменьшилось , но не достаточно. Помогите оптимизировать дальше. Да. Код будет в 99,9% выполняться на файловых базах Итак : Запрос.Текст = "ВЫБРАТЬ | УстановкаЦен.Номенклатура КАК Номенклатура, | УстановкаЦен.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры, | ВЫБОР | КОГДА ЕСТЬNULL(УстановкаЦен.ЕдиницаИзмерения.Коэффициент, 0) <> 0 | ТОГДА УстановкаЦен.Цена * УстановкаЦен.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент / УстановкаЦен.ЕдиницаИзмерения.Коэффициент | ИНАЧЕ УстановкаЦен.Цена | КОНЕЦ КАК ЦенаВРознице, | УстановкаЦен.Ссылка.Дата КАК Дата, | УстановкаЦен.Ссылка.Ссылка КАК ДокументУстановкиЦен |ПОМЕСТИТЬ ТабДока |ИЗ | Документ.УстановкаЦенНоменклатуры.Товары КАК УстановкаЦен |ГДЕ | УстановкаЦен.Ссылка = &Док | И УстановкаЦен.ТипЦен = &ТипЦен | И НЕ(УстановкаЦен.Номенклатура.НоменклатурнаяГруппа = ЗНАЧЕНИЕ(Справочник.НоменклатурныеГруппы.Тара) | ИЛИ УстановкаЦен.Номенклатура.НоменклатурнаяГруппа = ЗНАЧЕНИЕ(Справочник.НоменклатурныеГруппы.Оборудование)) |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ЕСТЬNULL(ЦеныНоменклатурыМагазиновБезХарактеристик.Цена, 0) КАК ЦенаВРозницеСтараяБезХар, | ЦеныНоменклатурыМагазиновБезХарактеристик.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры, | ЦеныНоменклатурыМагазиновБезХарактеристик.Номенклатура КАК Номенклатура |ПОМЕСТИТЬ ТабДокаРСПустаяХар |ИЗ | РегистрСведений.ЦеныНоменклатурыМагазинов.СрезПоследних( | &Дата, | Магазин = &Магазин | И Номенклатура В | (ВЫБРАТЬ | ТабДока.Номенклатура КАК Номенклатура | ИЗ | ТабДока КАК ТабДока) | И ХарактеристикаНоменклатуры = ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка)) КАК ЦеныНоменклатурыМагазиновБезХарактеристик |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ЕСТЬNULL(ЦеныНоменклатурыМагазиновХарактеристики.Цена, 0) КАК ЦенаВРозницеСтараяСХар, | ЦеныНоменклатурыМагазиновХарактеристики.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры, | ЦеныНоменклатурыМагазиновХарактеристики.Номенклатура КАК Номенклатура |ПОМЕСТИТЬ ТабДокаРСсХар |ИЗ | РегистрСведений.ЦеныНоменклатурыМагазинов.СрезПоследних( | &Дата, | Магазин = &Магазин | И НЕ ХарактеристикаНоменклатуры = ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка) | И (Номенклатура, ХарактеристикаНоменклатуры) В | (ВЫБРАТЬ | ТабДока.Номенклатура КАК Номенклатура, | ТабДока.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры | ИЗ | ТабДока КАК ТабДока)) КАК ЦеныНоменклатурыМагазиновХарактеристики |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТабДока.Номенклатура КАК Номенклатура, | ТабДока.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры, | ТабДока.ЦенаВРознице КАК ЦенаВРознице, | ЕСТЬNULL(ТабДокаРСсХар.ЦенаВРозницеСтараяСХар, ЕСТЬNULL(ТабДокаРСПустаяХар.ЦенаВРозницеСтараяБезХар, 0)) КАК ЦенаВРозницеСтарая, | ТабДока.Дата КАК Дата, | ТабДока.ДокументУстановкиЦен КАК ДокументУстановкиЦен |ИЗ | ТабДока КАК ТабДока | ЛЕВОЕ СОЕДИНЕНИЕ ТабДокаРСПустаяХар КАК ТабДокаРСПустаяХар | ПО ТабДока.Номенклатура = ТабДокаРСПустаяХар.Номенклатура | ЛЕВОЕ СОЕДИНЕНИЕ ТабДокаРСсХар КАК ТабДокаРСсХар | ПО ТабДока.Номенклатура = ТабДокаРСсХар.Номенклатура | И ТабДока.ХарактеристикаНоменклатуры = ТабДокаРСсХар.ХарактеристикаНоменклатуры |; | |//////////////////////////////////////////////////////////////////////////////// |УНИЧТОЖИТЬ ТабДока |; | |//////////////////////////////////////////////////////////////////////////////// |УНИЧТОЖИТЬ ТабДокаРСПустаяХар |; | |//////////////////////////////////////////////////////////////////////////////// |УНИЧТОЖИТЬ ТабДокаРСсХар"; |
|||
1
acsent
11.10.12
✎
18:02
|
сделай все разными запросами и проверь который дольше всех
|
|||
2
antgrom
11.10.12
✎
18:04
|
Смысл в том что я сначала создаю 3 временные таблицы и потом стою соединения с ними.
Проблема в том что документы УЦН иногда большие. ~ 10 000 строк для такого размера запрос считает ~ 5 минут. Хочется лучшего результата. (1) А дальнейшие действия ? |
|||
3
acsent
11.10.12
✎
18:05
|
(2) ну ты скажи какой тормозит и будем дальше думать
|
|||
4
Ёпрст
11.10.12
✎
18:05
|
Ну хотя бы проиндексируй временную табличку по тем полям, по которым у тебя левое соединение потом
|
|||
5
Ёпрст
11.10.12
✎
18:05
|
это для начала
|
|||
6
Kashemir
11.10.12
✎
18:14
|
Мне всегда казалось что уничтожение временных таблиц в конце запроса (без менеджера временных таблиц) смысла не имеет. Или я не прав ?
|
|||
7
Kashemir
11.10.12
✎
18:16
|
(0) ТабДока и ТабДокаРСсХар - индексировать по номенклатуре + характеристикам
|
|||
8
Kashemir
11.10.12
✎
18:19
|
(0) Нафига тащить установку цен, если ты ее режишь параметром ? Не проще включить в результирующую выборку сам параметр ?
| УстановкаЦен.Ссылка.Ссылка КАК ДокументУстановкиЦен |ПОМЕСТИТЬ ТабДока |ИЗ | Документ.УстановкаЦенНоменклатуры.Товары КАК УстановкаЦен |ГДЕ | УстановкаЦен.Ссылка = &Док |
|||
9
antgrom
11.10.12
✎
18:22
|
(3) Там вторая и третья таблицы зависят от первой. Сейчас посмотрю.
(8) Как раз в самом запросе я параметрами ничего не режу : Основное тело запроса : |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ТабДока.Номенклатура КАК Номенклатура, | ТабДока.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры, | ТабДока.ЦенаВРознице КАК ЦенаВРознице, | ЕСТЬNULL(ТабДокаРСсХар.ЦенаВРозницеСтараяСХар, ЕСТЬNULL(ТабДокаРСПустаяХар.ЦенаВРозницеСтараяБезХар, 0)) КАК ЦенаВРозницеСтарая, | ТабДока.Дата КАК Дата, | ТабДока.ДокументУстановкиЦен КАК ДокументУстановкиЦен |ИЗ | ТабДока КАК ТабДока | ЛЕВОЕ СОЕДИНЕНИЕ ТабДокаРСПустаяХар КАК ТабДокаРСПустаяХар | ПО ТабДока.Номенклатура = ТабДокаРСПустаяХар.Номенклатура | ЛЕВОЕ СОЕДИНЕНИЕ ТабДокаРСсХар КАК ТабДокаРСсХар | ПО ТабДока.Номенклатура = ТабДокаРСсХар.Номенклатура | И ТабДока.ХарактеристикаНоменклатуры = ТабДокаРСсХар.ХарактеристикаНоменклатуры |; | |
|||
10
Fragster
гуру
11.10.12
✎
18:24
|
Добавь индексирование своих временных таблииц
|
|||
11
Kashemir
11.10.12
✎
18:24
|
(9) Как это не режешь - тащишь поле с одним значеним из первой таблицы
ТабДока.ДокументУстановкиЦен КАК ДокументУстановкиЦен |
|||
12
Fragster
гуру
11.10.12
✎
18:24
|
по полям соединения
|
|||
13
antgrom
11.10.12
✎
18:26
|
Индексирование добавил ещё по совету (4)
Проверил получилось быстро Наверно результат устроит Всем Спасибо :) |
|||
14
Fragster
гуру
11.10.12
✎
18:29
|
ЦеныНоменклатурыМагазинов какая структура?
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |