Есть ли способ оптимизировать запрос?

1. Mishanam 29 11.07.19 16:38 Сейчас в теме
Добрый день!
Есть простой запрос, имеющий условие "В (&Процессы)". Параметр "Процессы" - это список значений, который формируется программно.
В консоли запросов руками заполнил этот параметр из 11 элементов и выполнил. Запрос выполнялся 7 секунд.

В качестве эксперимента заменил условие "В" и прописал в тексте запроса вместо В (&Процессы)" 11 параметров (ДанныеБизнесПроцессов.БизнесПроцесс = &Процесс1 или ДанныеБизнесПроцессов.БизнесПроцесс = &Процесс2 или ....и так 11 раз). Знаю, что использовать "Или" в запросе тоже не оптимально, однако запрос выполняется 1 секунду.

Есть ли способы оптимизировать исходный запрос и уйти от конструкции В или другим способом уменьшить время выполнения запроса?:

Вот его текст:

ВЫБРАТЬ РАЗРЕШЕННЫЕ
	ДанныеБизнесПроцессов.ГлавнаяЗадача КАК ГлавнаяЗадача,
	ДанныеБизнесПроцессов.ВедущаяЗадача КАК ВедущаяЗадача,
	ДанныеБизнесПроцессов.БизнесПроцесс КАК Ссылка,
	ДанныеБизнесПроцессов.Наименование КАК Наименование,
	ДанныеБизнесПроцессов.Завершен КАК Выполнена,
	ДанныеБизнесПроцессов.Дата КАК Дата,
	ДанныеБизнесПроцессов.ПометкаУдаления КАК ПометкаУдаления
ИЗ
	РегистрСведений.ДанныеБизнесПроцессов КАК ДанныеБизнесПроцессов
ГДЕ
	ДанныеБизнесПроцессов.БизнесПроцесс В (&Процессы)

УПОРЯДОЧИТЬ ПО
	Дата
Показать
По теме из базы знаний
Ответы
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
3. mkalimulin 1148 11.07.19 17:03 Сейчас в теме
(1) Вы его уже наши. Делайте много условий вместо "В".
4. Mishanam 29 11.07.19 17:04 Сейчас в теме
(3) Так не пойдёт, список формируется программно и я не знаю какие там будут элементы.
6. mkalimulin 1148 11.07.19 17:06 Сейчас в теме
(4) Так и список условий можно формировать программно. Используйте объект СхемаЗапроса.
14. Mishanam 29 11.07.19 20:06 Сейчас в теме
(6) я вас понял, поэксперементирую, спасибо
2. soft_wind 11.07.19 16:50 Сейчас в теме
Хм, попробуйте такой запрос
возможны какие-то опечатки, проверить же не на чем
Выбрать
	спр.Ссылка
Поместить Таб
Из
	БизнесПроцесс.Задание спр  //Здесь правильно свой безнес процесс укажите
где
	Спр.Ссылка в (&Процессы)
;	


ВЫБРАТЬ РАЗРЕШЕННЫЕ
    ДанныеБизнесПроцессов.ГлавнаяЗадача КАК ГлавнаяЗадача,
    ДанныеБизнесПроцессов.ВедущаяЗадача КАК ВедущаяЗадача,
    ДанныеБизнесПроцессов.БизнесПроцесс КАК Ссылка,
    ДанныеБизнесПроцессов.Наименование КАК Наименование,
    ДанныеБизнесПроцессов.Завершен КАК Выполнена,
    ДанныеБизнесПроцессов.Дата КАК Дата,
    ДанныеБизнесПроцессов.ПометкаУдаления КАК ПометкаУдаления
ИЗ
	Таб
левое соединение 	
    РегистрСведений.ДанныеБизнесПроцессов КАК ДанныеБизнесПроцессов
    по Таб.Ссылка = ДанныеБизнесПроцессов.БизнесПроцесс
ГДЕ
    ДанныеБизнесПроцессов.БизнесПроцесс Есть Не Null //В (&Процессы)
Показать
5. Mishanam 29 11.07.19 17:05 Сейчас в теме
(2) Мысль понятна, попробую проверить
7. JohnGalt 57 11.07.19 17:10 Сейчас в теме
Быстрее будет объединить нужное количество запросов, чтобы у каждого из них был свой параметр (условие = &ПроцессN)
8. SlavaKron 11.07.19 17:15 Сейчас в теме
"В (&Процессы)" должно быстрее работать, поэтому смотрите план запроса.
9. VmvLer 11.07.19 17:28 Сейчас в теме
разве что убрать

УПОРЯДОЧИТЬ ПО
Дата


или создать ВтПроцессы и протестировать безусловное соединение.
Думаю на малых таблицах "В" будет быстрее, а на громадных хз.
10. coollerinc 185 11.07.19 17:40 Сейчас в теме
Ограничте таблицу "Таб", условием В (&Процессы), поместите во временную, а потом просто так же соединяйтесь левым соединением с ТАБ

Проиндексируйте поле "БизнесПроцесс" в регистре(иле).
11. herfis 498 11.07.19 17:49 Сейчас в теме
Странно. Я бы первым делом убедился, что статистика актуальна. Обновил ее вручную, например (exec sp_updatestats, для mssql)
Возможно, закэширован неоптимальный план выполнения. Обновление статистики форсирует пересчет плана.
13. Mishanam 29 11.07.19 19:47 Сейчас в теме
(11) регламентные процедуры sql выполняются регулярно, но на всякий случай попробую сделать это вручную
16. Mishanam 29 11.07.19 21:48 Сейчас в теме
(11) Обновил статистику вручную, увы, результат не изменился
17. herfis 498 12.07.19 09:04 Сейчас в теме
(16) Безумный вариант - попробуй массивом передавать а не списком значений. По-идее, разницы быть не должно. Но 1C - мир чудес. Так как передача списком значений - редкий вариант, то в 1С могли на него забить и по факту запрос может отличаться.
20. Mishanam 29 12.07.19 09:57 Сейчас в теме
12. karpik666 3760 11.07.19 18:23 Сейчас в теме
Проверьте индекс по полю бизнес-процесс, какой он по порядку
15. Mishanam 29 11.07.19 21:14 Сейчас в теме
Преобразовал запрос в такой вид, время выполнения - всё еще 6 секунд.

ВЫБРАТЬ
	ДанныеБизнесПроцессов.БизнесПроцесс КАК БизнесПроцесс
ПОМЕСТИТЬ Таб
ИЗ
	РегистрСведений.ДанныеБизнесПроцессов КАК ДанныеБизнесПроцессов
ГДЕ
	ДанныеБизнесПроцессов.БизнесПроцесс В(&Процессы)

ИНДЕКСИРОВАТЬ ПО
	БизнесПроцесс
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ РАЗРЕШЕННЫЕ
	ДанныеБизнесПроцессов.ГлавнаяЗадача КАК ГлавнаяЗадача,
	ДанныеБизнесПроцессов.ВедущаяЗадача КАК ВедущаяЗадача,
	ДанныеБизнесПроцессов.БизнесПроцесс КАК Ссылка,
	ДанныеБизнесПроцессов.Наименование КАК Наименование,
	ДанныеБизнесПроцессов.Завершен КАК Выполнена,
	ДанныеБизнесПроцессов.Дата КАК Дата,
	ДанныеБизнесПроцессов.ПометкаУдаления КАК ПометкаУдаления
ИЗ
	Таб КАК Таб
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДанныеБизнесПроцессов КАК ДанныеБизнесПроцессов
		ПО Таб.БизнесПроцесс = ДанныеБизнесПроцессов.БизнесПроцесс
Показать
18. ben19791010 12.07.19 09:38 Сейчас в теме
19. Mishanam 29 12.07.19 09:52 Сейчас в теме
21. rintik 19 12.07.19 12:55 Сейчас в теме
У каких полей в регистре стоит "Основной отбор"?
22. rintik 19 12.07.19 13:02 Сейчас в теме
Если указано несколько измерений как "Основной отбор" - может попробовать все эти поля указать в отборе. Платформа строит составной индекс по всем полям с основным отбором. Отбор по одному полю тогда не оптимально.
23. Mishanam 29 12.07.19 15:07 Сейчас в теме
(22) Признак стоит у двух измерений. В моём случае я индексирую то измерение, по которому идёт соединение. У меня выборка будет 10-15 элементов, мне кажется, тут индексирование можно и не использовать, т.к. лишние ресурсы на создание индекса.

Что имею сейчас: Пакетный запрос, состоящий из 3-х запросов. В каждом из них используется условие "В(&Просцессы). Запрос выполняет 28 сек. Заменил это условие на "=&Процессы1 или =Процессы2 и т.д", программно формирую текст запроса. После изменения время выполнения запроса сократилось с 28 сек до 1 секунды.
Теперь планирую переделать запрос через объект СхемаЗапроса, чтобы было красиво.
Оставьте свое сообщение
Вакансии
1С аналитик
Москва
зарплата от 210 000 руб.
Полный день

Руководитель направления 1С
Москва
зарплата от 350 000 руб.
Полный день

1С Программист
Москва
зарплата от 180 000 руб.
Полный день

Программист 1С
Москва
зарплата от 180 000 руб. до 220 000 руб.
Полный день

Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)