Имя: Пароль:
1C
1С v8
Ускорить запрос с левым соединением
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
ЦеныНоменклатурыМагазинов какая структура?
Независимо от того, куда вы едете — это в гору и против ветра!