Имя: Пароль:
1C
1С v8
Помогите оптимизировать запрос
,
0 apl1978
 
07.07.14
17:08
Добрый день!

Ситуация: в базе (нетиповой) около 7500 позиций номенклатуры. Соответственно, как-минимум по столько же единиц измерения, цен и штрихкодов.

Есть запрос, который используется на форме подбора товаров. Хочется, чтобы он исполнялся быстрее. На данный момент замер производительности показывает значение чистого времени от 4 до 15. Кстати, второй вопрос - почему результат такой нестабильный даже в пределах одного запуска 1С.

Сам запрос:

ВЫБРАТЬ
    ОстаткиНоменклатурыОстатки.КоличествоОстаток КАК КоличествоОстаток,
    ОстаткиНоменклатурыОстатки.Номенклатура.ОсновнаяЕдиницаИзмерения КАК НоменклатураОсновнаяЕдиницаИзмерения
ПОМЕСТИТЬ ВТ_Остатки
ИЗ
    РегистрНакопления.ОстаткиНоменклатуры.Остатки(, Склад = &Склад) КАК ОстаткиНоменклатурыОстатки

ИНДЕКСИРОВАТЬ ПО
    НоменклатураОсновнаяЕдиницаИзмерения
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ЦеныНоменклатурыСрезПоследних.Цена,
    ЦеныНоменклатурыСрезПоследних.ЕдиницаИзмерения КАК ЕдиницаИзмерения
ПОМЕСТИТЬ ВТ_Цены
ИЗ
    РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ТипЦен = &ТипЦен) КАК ЦеныНоменклатурыСрезПоследних

ИНДЕКСИРОВАТЬ ПО
    ЕдиницаИзмерения
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    СправочникНоменклатура.Ссылка КАК Ссылка,
    СправочникНоменклатура.Код,
    СправочникНоменклатура.Артикул,
    СправочникНоменклатура.Наименование КАК Наименование,
    ШтрихКоды.ШтрихКод,
    ВТ_Остатки.КоличествоОстаток,
    ВТ_Цены.Цена,
    СправочникНоменклатура.ЭтоГруппа
ИЗ
    Справочник.Номенклатура КАК СправочникНоменклатура
        ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Цены КАК ВТ_Цены
        ПО СправочникНоменклатура.ОсновнаяЕдиницаИзмерения = ВТ_Цены.ЕдиницаИзмерения
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ШтрихКоды КАК ШтрихКоды
        ПО СправочникНоменклатура.ОсновнаяЕдиницаИзмерения = ШтрихКоды.Объект
        ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Остатки КАК ВТ_Остатки
        ПО СправочникНоменклатура.ОсновнаяЕдиницаИзмерения = ВТ_Остатки.НоменклатураОсновнаяЕдиницаИзмерения
ГДЕ
    НЕ СправочникНоменклатура.Ссылка.ЭтоГруппа

УПОРЯДОЧИТЬ ПО
    Наименование
ИТОГИ ПО
    Ссылка ТОЛЬКО ИЕРАРХИЯ

Надеюсь на помощь :)
1 Ёпрст
 
07.07.14
17:13
соединение по единице измерения, это сильно
2 Maxus43
 
07.07.14
17:14
чото я не пойму почему цена привязана к единице измерения, при чем тут она вобще - хз. Имхо не запрос надо оптимизировать, а логику
3 Ёпрст
 
07.07.14
17:15
ну и вот такие соединения
ПО СправочникНоменклатура.ОсновнаяЕдиницаИзмерения
это тоже пять!
4 Maxus43
 
07.07.14
17:16
это ж к одной номенклатурине таблица из сотен цен может приклеится. Где логика, шеф?
5 apl1978
 
07.07.14
17:17
(1) А чем плохо? В РегистрСведений.ШтрихКоды номенклатуры вообще нет. Есть только единицаизмерения.

(2) Цена выбирается сразу, чтобы потом при выборе строки ее повторно не искать

(1) Уважаемый Ёпрст, а можно поконкретнее, почему так нельзя? и как надо?
6 apl1978
 
07.07.14
17:17
(4) к одной номенклатуре приклеется только одна цена, т.к. связь по ее основной единице измерения
7 Maxus43
 
07.07.14
17:18
>>Кстати, второй вопрос - почему результат такой нестабильный даже в пределах одного запуска 1С
1с тоже кэширует данные. Первое выполнение запроса обычно идёт долго, последующие быстрей
8 Ёпрст
 
07.07.14
17:20
(5) получить останки по номенклатуре , религия запрещает ?
И всё остальное тоже ?

В курсе хоть, что есть соединение через точку ?
9 Maxus43
 
07.07.14
17:21
тут ссылка не нужна
ГДЕ
    НЕ СправочникНоменклатура.ЭтоГруппа
10 apl1978
 
07.07.14
17:21
(8) в курсе. в книжке написано, что через точку тормозить будет. сделал так
11 apl1978
 
07.07.14
17:26
(9) Спасибо! Но на результат это не повлияло
12 МихаилМ
 
07.07.14
17:27
(0)
забыли указать версию поатформы

для СрезПоследних это важно.

так же важна версия субд

и режим распараллеливания запросов.
13 Maxus43
 
07.07.14
17:27
(11) повлияло, но по сравнению с общим - незаметно
14 apl1978
 
07.07.14
17:28
(12) 8.3.4.482. файловая база. "и режим распараллеливания запросов." - это я не знаю. где посмотреть?
15 DmitriyDI
 
07.07.14
17:30
я не пойму одно тут что у одной номенклатуры одна единица измерения ?
16 apl1978
 
07.07.14
17:32
(15) У Номенклатуры есть реквизит - ОсновнаяЕдиницаИзмерения.
Этот запрос вытаскивает все данные именно для ОсновнойЕдиницыИзмерения. Единиц может быть несколько. Но Основная - одна для каждой номенклатуры.
17 DmitriyDI
 
07.07.14
17:33
(16) ОсновнаяЕдиницаИзмерения это ключевое поле у таблиц со связью 1 к 1 ?
18 apl1978
 
07.07.14
17:34
(17) Да
19 DmitriyDI
 
07.07.14
17:38
(18) а если отдельно посмотреть, какую из вложенных таблиц он собирает дольше всего?
20 DmitriyDI
 
07.07.14
17:41
(19) временных точнее
21 acsent
 
07.07.14
17:42
В данном запросе можно вообще отказаться от временных таблиц.
Плюс галку на регистр сведений
22 DmitriyDI
 
07.07.14
17:43
плюс попробуйте без индекса сформировать, не будет ли работать быстрее?
23 apl1978
 
07.07.14
17:45
(22), (21) без индекса было изначально. было намного дольше. и без временных таблиц было. так было совсем грустно

какую галку на регистр сведений?
24 apl1978
 
07.07.14
17:55
(19) Проверил - Временные таблицы получает практически мгновенно. Дольше всего выбирает именно справочник Номенклатура. Что-то можно с этим сделать?
25 DmitriyDI
 
07.07.14
18:00
(24) а если оставить только
ВЫБРАТЬ
    СправочникНоменклатура.Ссылка КАК Ссылка

из справочника номенклатура, так же долго?
26 Fragster
 
гуру
07.07.14
18:08
а нафига там итоги?
ну и в соединения добавить еще доп. условие на ссылку.
27 Кир Пластелинин
 
07.07.14
18:09
реквизит справочника проиндексирован?
28 samozvanec
 
07.07.14
18:28
(0) составные типы есть в полях, по которым соединяешь?
29 samozvanec
 
07.07.14
18:31
(24) чето я не вижу, чтоб он у тебя в отдельной таблице выбирался
30 apl1978
 
07.07.14
18:33
(25) завтра проверю
(26) для выгрузки в дерево на форме
(27) нет
(28) нет
(29) я каждую таблицу отдельно попробовал выбрать. результат в 24.
31 acsent
 
07.07.14
18:33
тогда нужно план смотреть
32 Kvant1C
 
07.07.14
21:10
(10) А в книжке объясняют, почему именно через точку тормозить будет?
33 Megas
 
07.07.14
21:41
Думаю не ускоришь.
В принципе без временных таблиц должно быть лучше.
34 К_Дач
 
07.07.14
23:43
"ВЫБРАТЬ
|    ТоварыНаСкладахОстатки.Номенклатура,
|    ТоварыНаСкладахОстатки.КоличествоОстаток
|ПОМЕСТИТЬ ВтОстатки
|ИЗ
|    РегистрНакопления.ТоварыНаСкладах.Остатки(, Склад = &Склад) КАК ТоварыНаСкладахОстатки
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
|    Номенклатура.Ссылка КАК Номенклатура,
|    ВтОстатки.КоличествоОстаток
|ПОМЕСТИТЬ ВтНоменклатураОстатки
|ИЗ
|    ВтОстатки КАК ВтОстатки
|        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура
|        ПО ВтОстатки.Номенклатура = Номенклатура.Ссылка
|ГДЕ
|    НЕ Номенклатура.ПометкаУдаления
|    И НЕ Номенклатура.ЭтоГруппа
|    И НЕ Номенклатура.Услуга
|ИНДЕКСИРОВАТЬ ПО
|    Номенклатура.Ссылка    
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
|    ВтНоменклатураОстатки.Номенклатура,
|    ВтНоменклатураОстатки.КоличествоОстаток,
|    ЦеныНоменклатурыСрезПоследних.Валюта,
|    ЦеныНоменклатурыСрезПоследних.Цена
|ИЗ
|    ВтНоменклатураОстатки КАК ВтНоменклатураОстатки
|        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
|                &ТекущаяДатаСеанса,
|                Номенклатура В
|                        (ВЫБРАТЬ
|                            ВтНоменклатураОстатки.Номенклатура
|                        ИЗ
|                            ВтНоменклатураОстатки КАК ВтНоменклатураОстатки)
|                    И ТипЦен = &РозничныеЦены
|                    И Валюта = &ВалютаУУ) КАК ЦеныНоменклатурыСрезПоследних
|        ПО ВтНоменклатураОстатки.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура"
35 К_Дач
 
07.07.14
23:45
Прикрути единицы свои и шк.

Если не взлетит (что у вас там за база такая???) можно попробовать динамически считывать список номенклатуры с формы до скроллинга и передавать в отборы виртуальных таблиц регистров для расчета
36 apl1978
 
08.07.14
08:55
(32) честно сказать, сейчас уже не вспомню, просто отложилось в памяти.

(33) изначально было без временных таблиц. Но потом под руку попала книжка "Настольная книга 1С:Эксперта по технологическим вопросам" и вот что там написано: " Не соединять виртуальные таблицы с реальными, а также виртуальные с виртуальными. Правильно сначала результат виртуальной таблицы записывать во временную таблицу, индексировать ее по полям соединения, а затем уже соединять." На самом деле после такого изменения запрос стал исполняться вдвое быстрее.

(35) Спасибо, сейчас пробовать буду. А как на управляемых формах "динамически считывать список номенклатуры с формы до скроллинга"? В 8.0-8.1 было событие "ПриПолученииДанных", которое возвращало коллекцию видимых строк таблицы. В управляемых такого я не нашел.
37 apl1978
 
08.07.14
09:03
(34) этот запрос вернет только ту номенклатуру, которая есть на остатках. Понятно, он будет работать быстрее, но надо всю номенклатуру получить.
38 К_Дач
 
08.07.14
10:49
(37) ну поменяй остатки и справочник местами и все. Раз у тебя УФ - тогда делай свой динамический список на форме подбора, с блэкджеком и шл.. и этот запрос определяй в качестве источника данных. На клиент будет возвращать только порцию данных, отображаемую до скроллинга на форме. Скроллишь - новый запрос на сервер.
39 apl1978
 
09.07.14
10:12
Помогло (9), хотя сразу и незаменто было и (28).
Всем спасибо за советы!
40 apl1978
 
09.07.14
10:14
ой, не (28) а (27) - индексация справочника по реквизиту
Ошибка? Это не ошибка, это системная функция.