1. Mishanam 24 11.07.19 16:38 Сейчас в теме

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

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

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

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

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

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

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


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

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


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

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

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

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

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

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

Вакансии

Бизнес-аналитик 1С
Санкт-Петербург
зарплата от 120 000 руб.
Полный день

Программист 1С
Москва
Полный день

Консультант-аналитик 1С
Москва
Полный день

Консультант ERP-систем
Москва
Временный (на проект)

Бизнес-аналитик 1С
Москва
зарплата от 90 000 руб. до 150 000 руб.
Полный день