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