Скорость выполнения запроса

1. Vegner 26 14.02.19 09:20 Сейчас в теме
Магазин автозапчастей, редакция 2.2 (2.2.11.16)
Платформа 1С:Предприятие 8.3 (8.3.13.1644)

Файловый вариант, база на ssd, один пользователь. Номенклатуры >130 000

Вот такой вот запрос

ВЫБРАТЬ
Номенклатура.Ссылка КАК Ссылка
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
Номенклатура.Ссылка В ИЕРАРХИИ(&Ссылка)
И Номенклатура.ЭтоГруппа = ЛОЖЬ

Выполняется 21 секунду . Почему так медленно? Как ускорить?
+
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
13. dhurricane 14.02.19 09:44 Сейчас в теме
(1) Посмотрите вот эту статью, возможно она Вам поможет:
https://infostart.ru/public/160707/
+
18. mivari 14.02.19 11:00 Сейчас в теме
(1) Как вариант можно при записи номенклатуры сохранять иерархию в регистр сведений, как сделано в УТ для партнеров. Тогда этот запрос будет выполняться при каждой записи, но читать можно будет быстро.
+
21. spacecraft 14.02.19 16:03 Сейчас в теме
(1) это точно время выполнения запроса? Может в замер попадает и получение этих записей на клиента?
+
2. DenisCh 14.02.19 09:23 Сейчас в теме
В ИЕРАРХИИ вообще тяжелая вещь, особенно если иерархия глубокая.
Kuzya_brаtsk; Plotks2017; ben19791010; +3
4. Vegner 26 14.02.19 09:27 Сейчас в теме
(2) есть идеи на что заменить?
+
6. dhurricane 14.02.19 09:30 Сейчас в теме
(4) А параметр &Ссылка принимает всего одно значение?
+
7. Vegner 26 14.02.19 09:30 Сейчас в теме
8. ben19791010 14.02.19 09:33 Сейчас в теме
(4)
есть идеи на что заменить?
зависит от уровня иерархии
если это 2 папки в корне то можно .Родитель использовать в запросе, либо другой критерий параметром задать
смотря что нужно(более детально)
+
3. Vegner 26 14.02.19 09:23 Сейчас в теме
в этой же базе вот такой запрос

ВЫБРАТЬ
Номенклатура.Ссылка КАК Ссылка
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
Номенклатура.ор_НомерПоКаталогу ПОДОБНО &ор_НомерПоКаталогу

Выполняется за 0,002 секунды
+
5. dhurricane 14.02.19 09:29 Сейчас в теме
(3) Отсюда вывод, что поиск по строке быстрее, чем по иерархии. :-)

Ну а если серьезно, то В ИЕРАРХИИ действительно довольно тяжелая операция. По сути для переданного в запрос параметра сначала выполняется запрос родителей. Затем запрос родителей родителей. И т.д. до тех пор, пока не будут получены все родительские элементы вверх по иерархии для параметра запроса. И уже потом полученный список используется для отбора номенклатуры.
+
9. Vegner 26 14.02.19 09:33 Сейчас в теме
(5) >> И т.д. до тех пор, пока не будут получены все родительские элементы вверх по иерархии для параметра запроса

Так переданный параметр &Ссылка, родитель самого верхнего уровня
+
10. dhurricane 14.02.19 09:35 Сейчас в теме
(9) Да, я чушь написал. Список выбирается из ИБ в обратном направлении.
+
15. DenisCh 14.02.19 09:46 Сейчас в теме
(5)
о сути для переданного в запрос параметра сначала выполняется запрос родителей. Затем запрос родителей родителей

Точнее наоборот ))
Ищутся дети, потом дети детей...
+
16. dhurricane 14.02.19 09:48 Сейчас в теме
(15) Да, я уже посыпал голову пеплом в (10) :-)
+
11. kumi2012 103 14.02.19 09:38 Сейчас в теме
Для теста скорости попробуйте вот так:

ВЫБРАТЬ
Номенклатура.Ссылка КАК Ссылка
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
Номенклатура.ЭтоГруппа = ЛОЖЬ
И (
Номенклатура.Родитель = &Ссылка
ИЛИ
Номенклатура.Родитель.Родитель = &Ссылка
ИЛИ
Номенклатура.Родитель.Родитель.Родитель = &Ссылка
...
)
+
12. dhurricane 14.02.19 09:41 Сейчас в теме
(11) Операторы "ИЛИ" лучше заменить на "И" и объединение.
+
14. Vegner 26 14.02.19 09:45 Сейчас в теме
(11) уже попробовал , еще медленнее работает
+
17. kumi2012 103 14.02.19 09:55 Сейчас в теме
(14) Тогда вариант - установка SQL
+
19. Spirit007 14.02.19 14:04 Сейчас в теме
(14)

Можно попробовать в запросе сначала отобрать всех родителей принадлежащих группе Ссылка во временную таблицу, затем вторым пакетом запроса уже соединить эту таблицу с номенклатурой по полю родитель
+
20. ildarovich 7861 14.02.19 15:49 Сейчас в теме
Я бы сначала попробовал:
1) выполнить запрос под полными правами, чтобы убедиться, что торможение не в системе проверки прав;
2) воспроизвел запрос по иерархии "ручным способом" через загрузку номенклатуры (полей Родитель, Ссылка) в ВТ, индексацию по полю Родитель этой ВТ и последовательное соединение самой ссылки, детей, внуков и так далее с этой ВТ, чтобы получать более далеких потомков.

По идее, если эти соединения используют индекс, для 130 000 записей 20 сек слишком много. Так как даже для 10 соединений (10-ти уровневый справочник) будет обрабатываться порядка миллиона записей. А это примерно секунда (порядка секунды).

3) если узкое место так и не найдется, то начать думать над регистром сведений родитель-потомок, который формировался бы при первом запуске запроса, если с момента предыдущего запуска происходила запись в справочник Номенклатура (ленивые вычисления).
triviumfan; +1
26. Vegner 26 15.02.19 10:32 Сейчас в теме
(20) думал об этом, но потом понял, что мне собственно и не надо находить все вложенные, только в той папке, на которой спозиционировался пользователь, поэтому
Номенклатура.Родитель=&Родитель мне подходит.
+
27. Vegner 26 15.02.19 10:35 Сейчас в теме
(20) Я думал о таком способе, но потом понял, что мне и не надо всех вложенных, мне нужны только те что находятся в определенной папке, поэтому Номенклатура.Родитель=&Родитель мне подходит
+
22. ben19791010 15.02.19 05:08 Сейчас в теме
а если так посмотреть?
ВЫБРАТЬ
	Номенклатура.Ссылка КАК Элемент,
	Номенклатура.Родитель КАК СтаршийРодитель
ИЗ
	Справочник.Номенклатура КАК Номенклатура
ГДЕ
	Номенклатура.ЭтоГруппа = ЛОЖЬ и Номенклатура.Родитель=&Старшой
ИТОГИ ПО
	Элемент ИЕРАРХИЯ
Показать
+
23. ben19791010 15.02.19 05:10 Сейчас в теме
(22) пардоньте - фигню написал ))
+
24. Infector 201 15.02.19 07:07 Сейчас в теме
Простите, но первый вопрос - частью какой задачи это является? Если это один раз пересчитать некие реквизиты в номенклатуре, то смысла сражаться за ускорение ноль, Вы максимум пару раз это запустите. Если же задача из области каждодневного пользования - зачем там понадобилось 130к записей с номенклатурой?
+
25. Vegner 26 15.02.19 10:29 Сейчас в теме
(24) Это будет форма подбора номенклатуры из документов "Чек" и "Реализация товаров"
+
28. Infector 201 15.02.19 10:53 Сейчас в теме
(25)но на форме номенклатуры стоит использовать динамический список, а там эффективнее оставить запрос в виде
ВЫБРАТЬ Т.Ссылка,
 Т.Код,
 Т.Наименование
ИЗ Справочник.Номенклатура КАК Т

(Т.е. без параметров), а к этому списку устанавливать отборы. Например:

СодержимоеОбъектаХранения.Отбор.Элементы.Очистить();
		ЭлОтбора = СодержимоеОбъектаХранения.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
		ЭлОтбора.ЛевоеЗначение	=	Новый ПолеКомпоновкиДанных("ОбъектХранения");
		ЭлОтбора.Использование	=	Истина;
		ЭлОтбора.ПравоеЗначение	= 	ТекОбъктХранения;
+
29. Vegner 26 15.02.19 18:52 Сейчас в теме
(28) динамические списки и используются, но запрос будет выглядеть немного сложнее, т.к. нужны остатки и цены в колонках, а не в отдельной таблице
+
30. Infector 201 15.02.19 19:35 Сейчас в теме
(29)смысл в том, что с динамическими списками лучше избегать параметров. Отбор на уровне СКД дает больше толку.
+
31. Дмитрий74Чел 234 27.02.19 09:40 Сейчас в теме
(0) В ERP для ускорения поиска по иерархии в справочнике Партнеров используется регистр "Иерархия партнеров": Ссылка/Родитель/Уровень.
+
Внимание! Тема сдана в архив

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот