Медленная выборка из временной таблицы

1. Barmolei 2 11.11.19 14:25 Сейчас в теме
При работе с ветсистемой Меркурий, используется запрос остатков на стороне Меркурия, результат которого заносится в таблицу значений «Остатки». Далее при создании документа "Ветеринарное свидетельство" по номенклатурной позиции запросом вытаскивается необходимая партия.
Ранее когда строк остатков было примерно около 100-200, то скорость выборки из таблицы значений была нормальной (1-2 секунды), то сейчас это 10-15 секунд из таблицы 500-700 строк. Соответственно при создании ветдокументов (300-400 штук в день) время ожидания стало очень затратным.

Подскажите, пжл, оптимальный выход из ситуации. Ниже текст запроса (если убрать условия, то скорость запроса увеличивается не значительно):

ВЫБРАТЬ
	О.ГУИД КАК ГУИД,
	О.ДатаВыработки КАК ДатаВыработки,
	О.ДатаПросрочки КАК ДатаПросрочки,
	О.ДатаВыработкиКон КАК ДатаВыработкиКон,
	О.ДатаПросрочкиКон КАК ДатаПросрочкиКон,
	О.ДатаВыработкиСтрокой КАК ДатаВыработкиСтрокой,
	О.ДатаПросрочкиСтрокой КАК ДатаПросрочкиСтрокой,
	О.ЕдиницаХранения КАК ЕдиницаХранения,
	О.Фасовка КАК Фасовка,
	О.КодПартии КАК КодПартии,
	О.Количество,
	О.КоличествоУпаковок,
	О.Категория КАК Категория,
	О.Номенклатура КАК Номенклатура,
	О.НоменклатураСтрокой КАК НоменклатураСтрокой,
	О.ГУИДНоменклатуры,
	О.Организация КАК Организация,
	О.ДатаСоздания КАК ДатаСоздания,
	О.ГУИДПроизводителя КАК ГУИДПроизводителя,
	О.Производитель,
	О.СписокПроизводителей,
	О.НомерСЗ
ПОМЕСТИТЬ Остатки
ИЗ
	&Остатки КАК О
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	СкладскиеЗаписи.Категория КАК Категория,
	СкладскиеЗаписи.Номенклатура КАК Номенклатура,
	СкладскиеЗаписи.ЕдиницаХранения КАК Единица,
	СкладскиеЗаписи.Количество КАК КоличествоОстаток,
	СкладскиеЗаписи.КоличествоУпаковок КАК КоличествоУпаковокОстаток,
	СкладскиеЗаписи.ДатаВыработки КАК ДатаВыработки,
	СкладскиеЗаписи.ДатаПросрочки КАК ДатаПросрочки,
	СкладскиеЗаписи.ДатаВыработкиКон КАК ДатаВыработкиКон,
	СкладскиеЗаписи.ДатаПросрочкиКон КАК ДатаПросрочкиКон,
	СкладскиеЗаписи.ДатаВыработкиСтрокой КАК ДатаВыработкиСтрокой,
	СкладскиеЗаписи.ДатаПросрочкиСтрокой КАК ДатаПросрочкиСтрокой,
	СкладскиеЗаписи.НомерСЗ,
	СкладскиеЗаписи.ГУИД КАК ГУИД,
	СкладскиеЗаписи.Фасовка КАК Фасовка,
	СкладскиеЗаписи.КодПартии КАК КодПартии,
	СкладскиеЗаписи.НоменклатураСтрокой КАК НоменклатураСтрокой,
	СкладскиеЗаписи.ГУИДНоменклатуры,
	СкладскиеЗаписи.ГУИДПроизводителя КАК ГУИДПроизводителя,
	СкладскиеЗаписи.Производитель,
	СкладскиеЗаписи.СписокПроизводителей
ИЗ
	Остатки КАК СкладскиеЗаписи
ГДЕ
	СкладскиеЗаписи.Организация = &Организация
	И (&ДатаВыработки = ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
			ИЛИ &ДатаВыработки <= СкладскиеЗаписи.ДатаВыработки
			ИЛИ СкладскиеЗаписи.ДатаВыработки = ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0))
	И СкладскиеЗаписи.Количество > 0
	И (&ГУИДПроизводителя = ""
			ИЛИ (ВЫРАЗИТЬ(СкладскиеЗаписи.ГУИДПроизводителя КАК СТРОКА(36))) = &ГУИДПроизводителя)
	И ВЫБОР
			КОГДА &Номенклатура = НЕОПРЕДЕЛЕНО
					ИЛИ СкладскиеЗаписи.Номенклатура = НЕОПРЕДЕЛЕНО
					ИЛИ СкладскиеЗаписи.Номенклатура = &ПустойТовар
				ТОГДА СкладскиеЗаписи.Категория = &Категория
			ИНАЧЕ СкладскиеЗаписи.Номенклатура = &Номенклатура
		КОНЕЦ
	И (НЕ СкладскиеЗаписи.КоличествоУпаковок ПОДОБНО "%устаревшая%")
	И (&КодПартии = ""
			ИЛИ СкладскиеЗаписи.КодПартии = &КодПартии)

УПОРЯДОЧИТЬ ПО
	Номенклатура УБЫВ,
	ДатаВыработки,
	СкладскиеЗаписи.ДатаСоздания
Показать
По теме из базы знаний
Найденные решения
30. Barmolei 2 11.11.19 21:13 Сейчас в теме
(1) Вообщем решение оказалось таким:

Перед выполнением запроса сворачивалась таблица значений по номенклатуре, и запрос отрабатывался уже по этой таблице.
Спасибо за помощь и новые познания.

Отбор = Новый Структура;
Отбор.Вставить("Номенклатура", Запрос.Параметры.Номенклатура);
ОстаткиПоНоменклатуре = Остатки.Скопировать(Отбор);
Запрос.УстановитьПараметр("Остатки", ОстаткиПоНоменклатуре);
Остальные ответы
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
20. AlexandrSmith 68 11.11.19 16:38 Сейчас в теме
(1) https://programmist1s.ru/indeksirovat-po-v-zaprose-1s/

Разработчики 1С очень часто игнорируют использование конструкции «ИНДЕКСИРОВАТЬ ПО» в запросе.

Может появиться прирост производительности запроса, но не большой.
ВЫБРАТЬ
	О.ГУИД КАК ГУИД,
	О.ДатаВыработки КАК ДатаВыработки,
	О.ДатаПросрочки КАК ДатаПросрочки,
	О.ДатаВыработкиКон КАК ДатаВыработкиКон,
	О.ДатаПросрочкиКон КАК ДатаПросрочкиКон,
	О.ДатаВыработкиСтрокой КАК ДатаВыработкиСтрокой,
	О.ДатаПросрочкиСтрокой КАК ДатаПросрочкиСтрокой,
	О.ЕдиницаХранения КАК ЕдиницаХранения,
	О.Фасовка КАК Фасовка,
	О.КодПартии КАК КодПартии,
	О.Количество КАК Количество,
	О.КоличествоУпаковок КАК КоличествоУпаковок,
	О.Категория КАК Категория,
	О.Номенклатура КАК Номенклатура,
	О.НоменклатураСтрокой КАК НоменклатураСтрокой,
	О.ГУИДНоменклатуры КАК ГУИДНоменклатуры,
	О.Организация КАК Организация,
	О.ДатаСоздания КАК ДатаСоздания,
	О.ГУИДПроизводителя КАК ГУИДПроизводителя,
	О.Производитель КАК Производитель,
	О.СписокПроизводителей КАК СписокПроизводителей,
	О.НомерСЗ КАК НомерСЗ
ПОМЕСТИТЬ Остатки
ИЗ
	&Остатки КАК О

ИНДЕКСИРОВАТЬ ПО
	Номенклатура,
	ДатаВыработки,
	ГУИДПроизводителя,
	КодПартии
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	СкладскиеЗаписи.Категория КАК Категория,
	СкладскиеЗаписи.Номенклатура КАК Номенклатура,
	СкладскиеЗаписи.ЕдиницаХранения КАК Единица,
	СкладскиеЗаписи.Количество КАК КоличествоОстаток,
	СкладскиеЗаписи.КоличествоУпаковок КАК КоличествоУпаковокОстаток,
	СкладскиеЗаписи.ДатаВыработки КАК ДатаВыработки,
	СкладскиеЗаписи.ДатаПросрочки КАК ДатаПросрочки,
	СкладскиеЗаписи.ДатаВыработкиКон КАК ДатаВыработкиКон,
	СкладскиеЗаписи.ДатаПросрочкиКон КАК ДатаПросрочкиКон,
	СкладскиеЗаписи.ДатаВыработкиСтрокой КАК ДатаВыработкиСтрокой,
	СкладскиеЗаписи.ДатаПросрочкиСтрокой КАК ДатаПросрочкиСтрокой,
	СкладскиеЗаписи.НомерСЗ КАК НомерСЗ,
	СкладскиеЗаписи.ГУИД КАК ГУИД,
	СкладскиеЗаписи.Фасовка КАК Фасовка,
	СкладскиеЗаписи.КодПартии КАК КодПартии,
	СкладскиеЗаписи.НоменклатураСтрокой КАК НоменклатураСтрокой,
	СкладскиеЗаписи.ГУИДНоменклатуры КАК ГУИДНоменклатуры,
	СкладскиеЗаписи.ГУИДПроизводителя КАК ГУИДПроизводителя,
	СкладскиеЗаписи.Производитель КАК Производитель,
	СкладскиеЗаписи.СписокПроизводителей КАК СписокПроизводителей
ИЗ
	Остатки КАК СкладскиеЗаписи
ГДЕ
	СкладскиеЗаписи.Организация = &Организация
	И (&ДатаВыработки = ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
			ИЛИ &ДатаВыработки <= СкладскиеЗаписи.ДатаВыработки
			ИЛИ СкладскиеЗаписи.ДатаВыработки = ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0))
	И СкладскиеЗаписи.Количество > 0
	И (&ГУИДПроизводителя = ""
			ИЛИ (ВЫРАЗИТЬ(СкладскиеЗаписи.ГУИДПроизводителя КАК СТРОКА(36))) = &ГУИДПроизводителя)
	И ВЫБОР
			КОГДА &Номенклатура = НЕОПРЕДЕЛЕНО
					ИЛИ СкладскиеЗаписи.Номенклатура = НЕОПРЕДЕЛЕНО
					ИЛИ СкладскиеЗаписи.Номенклатура = &ПустойТовар
				ТОГДА СкладскиеЗаписи.Категория = &Категория
			ИНАЧЕ СкладскиеЗаписи.Номенклатура = &Номенклатура
		КОНЕЦ
	И НЕ СкладскиеЗаписи.КоличествоУпаковок ПОДОБНО "%устаревшая%"
	И (&КодПартии = ""
			ИЛИ СкладскиеЗаписи.КодПартии = &КодПартии)

УПОРЯДОЧИТЬ ПО
	Номенклатура УБЫВ,
	ДатаВыработки,
	СкладскиеЗаписи.ДатаСоздания
Показать
21. Barmolei 2 11.11.19 16:48 Сейчас в теме
24. YannikAlx 43 11.11.19 17:28 Сейчас в теме
(1) Самый главный вопрос так и не задали автору! Где вы тут увидели ВИРТУАЛЬНУЮ таблицу?
Может все -таки Временная таблица?
26. TODD22 18 11.11.19 17:45 Сейчас в теме
(24)
Самый главный вопрос так и не задали автору! Где вы тут увидели ВИРТУАЛЬНУЮ таблицу?

Вы думаете если автор не будет путать название то скорость выполнения запроса увеличится?
28. YannikAlx 43 11.11.19 17:50 Сейчас в теме
(26) Думаю, что если называть вещи СВОИМИ именами - проще вообще будет в этом мире! Нет?
Если вам в магазине на коробке будет написано одно, а дома вы откроете и увидите совершенно другое , но тоже качественое - просто Другое и за такую же цену, вы как к этому отнесетесь?

Разруха не в клозетах , она - в головах! А спать нужно в спальне, а не в прихожей...
Если я не буду протру звезды и медвежонок не протрет звезды, то кто же протрет их?

Если не указывать писателям на явные ляпы, то скоро мы вообще перестанем понимать друг друга, уже сейчас порой автор об одном спрашивает, а ответов туча совершенно не в тему...
25. TODD22 18 11.11.19 17:43 Сейчас в теме
(1)
Подскажите, пжл, оптимальный выход из ситуации. Ниже текст запроса (если убрать условия, то скорость запроса увеличивается не значительно):

А какие условия вы убираете? Точно все? И упорядочивание то же?
30. Barmolei 2 11.11.19 21:13 Сейчас в теме
(1) Вообщем решение оказалось таким:

Перед выполнением запроса сворачивалась таблица значений по номенклатуре, и запрос отрабатывался уже по этой таблице.
Спасибо за помощь и новые познания.

Отбор = Новый Структура;
Отбор.Вставить("Номенклатура", Запрос.Параметры.Номенклатура);
ОстаткиПоНоменклатуре = Остатки.Скопировать(Отбор);
Запрос.УстановитьПараметр("Остатки", ОстаткиПоНоменклатуре);
2. VmvLer 11.11.19 14:37 Сейчас в теме
это не запрос, а "черный ящик" механизма представлений и оптимизировать его так же мудро как топить Эверест в Индийском океане.
когда нибудь решение будет найдено в ..следующей геологической эре

покажите из отладки реальный запрос
3. VmvLer 11.11.19 14:41 Сейчас в теме
а нет - это не механизм представлений, но брошенный камень уже не вернешь

обилии ИЛИ намекает на суперкостыль, замедление намекает на кривую архитектуру решения или облуживания БД, ПОДОБНО песня вообще.
за такое условие полагается наказание розгами

буду ждать гуру аналитики.
4. YannikAlx 43 11.11.19 14:50 Сейчас в теме
(3) ну розгами у нас уже отменили .... да и не гуманно!
отключить электричество на месяц - пусть учится программировать на счетах.
5. Barmolei 2 11.11.19 14:59 Сейчас в теме
Друзья, это код от компании АСП, которая занимается автоматизацией выписки электронных ветеринарных документов.
6. nomad_irk 71 11.11.19 15:01 Сейчас в теме
(5)Текст запроса говорит только об уровне квалификации его составившего.
Сколько чистого времени выполняется запрос из таблицы в 900 строк?
9. Barmolei 2 11.11.19 15:10 Сейчас в теме
13. nomad_irk 71 11.11.19 15:33 Сейчас в теме
(9)Аппаратных проблем с сервером нет?
15. Sashares 34 11.11.19 15:38 Сейчас в теме
(9)А почему вы решили, что проблема в использовании временной таблицы, а не в отборах?
Например, сделать запрос из временной таблицы без отборов, он что, тоже будет 15 секунд выполняться?

Временная таблица без индексов, на нее накладываются отборы, которые возможно не нужны (ДатаВыбработки, ГУИДПроизводителя, КодПартии).
Добавить индексы, модифицировать текст запроса - добавляя нужные отборы.
И посмотреть что получится.
16. Barmolei 2 11.11.19 15:42 Сейчас в теме
(15) Если максимально упрощаем запрос, то всё равно 9-12 сек.

ВЫБРАТЬ
	О.ГУИД КАК ГУИД,
	О.ДатаВыработки КАК ДатаВыработки,
	О.ДатаПросрочки КАК ДатаПросрочки,
	О.ДатаВыработкиКон КАК ДатаВыработкиКон,
	О.ДатаПросрочкиКон КАК ДатаПросрочкиКон,
	О.ДатаВыработкиСтрокой КАК ДатаВыработкиСтрокой,
	О.ДатаПросрочкиСтрокой КАК ДатаПросрочкиСтрокой,
	О.ЕдиницаХранения КАК ЕдиницаХранения,
	О.Фасовка КАК Фасовка,
	О.КодПартии КАК КодПартии,
	О.Количество КАК Количество,
	О.КоличествоУпаковок КАК КоличествоУпаковок,
	О.Категория КАК Категория,
	О.Номенклатура КАК Номенклатура,
	О.НоменклатураСтрокой КАК НоменклатураСтрокой,
	О.ГУИДНоменклатуры КАК ГУИДНоменклатуры,
	О.Организация КАК Организация,
	О.ДатаСоздания КАК ДатаСоздания,
	О.ГУИДПроизводителя КАК ГУИДПроизводителя,
	О.Производитель КАК Производитель,
	О.СписокПроизводителей КАК СписокПроизводителей,
	О.НомерСЗ КАК НомерСЗ
ПОМЕСТИТЬ Остатки
ИЗ
	&Остатки КАК О
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	СкладскиеЗаписи.Номенклатура КАК Номенклатура
ИЗ
	Остатки КАК СкладскиеЗаписи
Показать
17. Sashares 34 11.11.19 15:45 Сейчас в теме
(16) А в исходной таблице значений данные только по нужной организации?
18. Barmolei 2 11.11.19 15:47 Сейчас в теме
19. Sashares 34 11.11.19 15:52 Сейчас в теме
(18)Ну можно предложить вместо запроса сделать отбор записей в цикле по нужным условиям.
22. spacecraft 11.11.19 16:53 Сейчас в теме
(16)
1. в каком модуле это применяется?
2. УФ или ОФ?
3. Платформа 1С?
4. Это замер времени чисто запроса или с заполнение ТЗ?
23. Barmolei 2 11.11.19 17:14 Сейчас в теме
(22) 1. В модуле документа
2. ОФ
3. 8.1
4. Чисто запрос в консоли.
27. Sashares 34 11.11.19 17:47 Сейчас в теме
(23)В обычных формах (обычном приложении) модуль документа выполняется на клиенте.
То есть на ресурсах компьютера где запущен сеанс 1с предприятия.

Можно предложить перенести процедуру в общий модуль с флагами Сервер и ВызовСервера.
Тогда будет выполняться на сервере.

Перенесите процедуру на сервер и сделайте замер.
29. spacecraft 11.11.19 17:57 Сейчас в теме
(23) вот и ответ. Код выполняется на клиенте.
Т.е. ТЗ передается с клиента на сервер и уже там выполняется запрос. А замер времени это все включает.
Попробуйте создавать ТЗ и выполнять запрос на сервере.
Самый большой "затык" это передача данных клиент-сервер-клиент.
8. SaschaL 11.11.19 15:05 Сейчас в теме
если у вас клиент серверная база пробуйте настроить обслуживание базы и пере создание индексов, возможно будет быстрее
10. Barmolei 2 11.11.19 15:15 Сейчас в теме
Может не использовать запрос из Таблицы значений, а выгружать её изначально например в регистр сведений, а затем уже из него вытаскивать значения с исключением забранных партий.
11. Barmolei 2 11.11.19 15:23 Сейчас в теме
Используем клиент-серверный вариант. Выход конечно имеется - поменять серверное железо, так как на рабочей станции с винтом m.2 Samsung EVO 970 Plus, запрос выполняется мгновенно.
12. VmvLer 11.11.19 15:29 Сейчас в теме
(11) сервер 1995 года и диск уже слышно как шкрябает по головкам?

зачем тогда сыр-бор разводить, пишите благодарность за оптимальное решение.
14. Barmolei 2 11.11.19 15:37 Сейчас в теме
(12) сервер гораздо моложе и со всеми задачами справляется нормально, только вот этот запрос мучает пользователей ожиданием)
Оставьте свое сообщение
Вакансии
1С аналитик
Москва
зарплата от 210 000 руб.
Полный день

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

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

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

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