Магазин автозапчастей, редакция 2.2 (2.2.11.16)
Платформа 1С:Предприятие 8.3 (8.3.13.1644)
Файловый вариант, база на ssd, один пользователь. Номенклатуры >130 000
Вот такой вот запрос
ВЫБРАТЬ
Номенклатура.Ссылка КАК Ссылка
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
Номенклатура.Ссылка В ИЕРАРХИИ(&Ссылка)
И Номенклатура.ЭтоГруппа = ЛОЖЬ
Выполняется 21 секунду . Почему так медленно? Как ускорить?
Платформа 1С:Предприятие 8.3 (8.3.13.1644)
Файловый вариант, база на ssd, один пользователь. Номенклатуры >130 000
Вот такой вот запрос
ВЫБРАТЬ
Номенклатура.Ссылка КАК Ссылка
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
Номенклатура.Ссылка В ИЕРАРХИИ(&Ссылка)
И Номенклатура.ЭтоГруппа = ЛОЖЬ
Выполняется 21 секунду . Почему так медленно? Как ускорить?
По теме из базы знаний
- Описание механизмов программных реализаций на платформе 1С:Предприятие 8.1 : «Использование временных таблиц в запросах»
- Консоль запросов для управляемого приложения для запуска в "1С:Предприятии" 8.2 с планом выполнения запроса
- Обработка для замера скорости работы запросов
- Опять эти запросы...
- Нечеткий поиск одним запросом
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
в этой же базе вот такой запрос
ВЫБРАТЬ
Номенклатура.Ссылка КАК Ссылка
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
Номенклатура.ор_НомерПоКаталогу ПОДОБНО &ор_НомерПоКаталогу
Выполняется за 0,002 секунды
ВЫБРАТЬ
Номенклатура.Ссылка КАК Ссылка
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
Номенклатура.ор_НомерПоКаталогу ПОДОБНО &ор_НомерПоКаталогу
Выполняется за 0,002 секунды
(3) Отсюда вывод, что поиск по строке быстрее, чем по иерархии. :-)
Ну а если серьезно, то В ИЕРАРХИИ действительно довольно тяжелая операция. По сути для переданного в запрос параметра сначала выполняется запрос родителей. Затем запрос родителей родителей. И т.д. до тех пор, пока не будут получены все родительские элементы вверх по иерархии для параметра запроса. И уже потом полученный список используется для отбора номенклатуры.
Ну а если серьезно, то В ИЕРАРХИИ действительно довольно тяжелая операция. По сути для переданного в запрос параметра сначала выполняется запрос родителей. Затем запрос родителей родителей. И т.д. до тех пор, пока не будут получены все родительские элементы вверх по иерархии для параметра запроса. И уже потом полученный список используется для отбора номенклатуры.
Для теста скорости попробуйте вот так:
ВЫБРАТЬ
Номенклатура.Ссылка КАК Ссылка
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
Номенклатура.ЭтоГруппа = ЛОЖЬ
И (
Номенклатура.Родитель = &Ссылка
ИЛИ
Номенклатура.Родитель.Родитель = &Ссылка
ИЛИ
Номенклатура.Родитель.Родитель.Родитель = &Ссылка
...
)
ВЫБРАТЬ
Номенклатура.Ссылка КАК Ссылка
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
Номенклатура.ЭтоГруппа = ЛОЖЬ
И (
Номенклатура.Родитель = &Ссылка
ИЛИ
Номенклатура.Родитель.Родитель = &Ссылка
ИЛИ
Номенклатура.Родитель.Родитель.Родитель = &Ссылка
...
)
Я бы сначала попробовал:
1) выполнить запрос под полными правами, чтобы убедиться, что торможение не в системе проверки прав;
2) воспроизвел запрос по иерархии "ручным способом" через загрузку номенклатуры (полей Родитель, Ссылка) в ВТ, индексацию по полю Родитель этой ВТ и последовательное соединение самой ссылки, детей, внуков и так далее с этой ВТ, чтобы получать более далеких потомков.
По идее, если эти соединения используют индекс, для 130 000 записей 20 сек слишком много. Так как даже для 10 соединений (10-ти уровневый справочник) будет обрабатываться порядка миллиона записей. А это примерно секунда (порядка секунды).
3) если узкое место так и не найдется, то начать думать над регистром сведений родитель-потомок, который формировался бы при первом запуске запроса, если с момента предыдущего запуска происходила запись в справочник Номенклатура (ленивые вычисления).
1) выполнить запрос под полными правами, чтобы убедиться, что торможение не в системе проверки прав;
2) воспроизвел запрос по иерархии "ручным способом" через загрузку номенклатуры (полей Родитель, Ссылка) в ВТ, индексацию по полю Родитель этой ВТ и последовательное соединение самой ссылки, детей, внуков и так далее с этой ВТ, чтобы получать более далеких потомков.
По идее, если эти соединения используют индекс, для 130 000 записей 20 сек слишком много. Так как даже для 10 соединений (10-ти уровневый справочник) будет обрабатываться порядка миллиона записей. А это примерно секунда (порядка секунды).
3) если узкое место так и не найдется, то начать думать над регистром сведений родитель-потомок, который формировался бы при первом запуске запроса, если с момента предыдущего запуска происходила запись в справочник Номенклатура (ленивые вычисления).
а если так посмотреть?
ВЫБРАТЬ
Номенклатура.Ссылка КАК Элемент,
Номенклатура.Родитель КАК СтаршийРодитель
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
Номенклатура.ЭтоГруппа = ЛОЖЬ и Номенклатура.Родитель=&Старшой
ИТОГИ ПО
Элемент ИЕРАРХИЯ
Показать
Простите, но первый вопрос - частью какой задачи это является? Если это один раз пересчитать некие реквизиты в номенклатуре, то смысла сражаться за ускорение ноль, Вы максимум пару раз это запустите. Если же задача из области каждодневного пользования - зачем там понадобилось 130к записей с номенклатурой?
(25)но на форме номенклатуры стоит использовать динамический список, а там эффективнее оставить запрос в виде
(Т.е. без параметров), а к этому списку устанавливать отборы. Например:
ВЫБРАТЬ Т.Ссылка,
Т.Код,
Т.Наименование
ИЗ Справочник.Номенклатура КАК Т
(Т.е. без параметров), а к этому списку устанавливать отборы. Например:
СодержимоеОбъектаХранения.Отбор.Элементы.Очистить();
ЭлОтбора = СодержимоеОбъектаХранения.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ОбъектХранения");
ЭлОтбора.Использование = Истина;
ЭлОтбора.ПравоеЗначение = ТекОбъктХранения;
Внимание! Тема сдана в архив
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот