1. Barmolei 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 11.11.19 21:13 Сейчас в теме
(1) Вообщем решение оказалось таким:

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

Отбор = Новый Структура;
Отбор.Вставить("Номенклатура", Запрос.Параметры.Номенклатура);
ОстаткиПоНоменклатуре = Остатки.Скопировать(Отбор);
Запрос.УстановитьПараметр("Остатки", ОстаткиПоНоменклатуре);
Остальные ответы
Избранное Подписка Сортировка: Древо
20. AlexandrSmith 47 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 11.11.19 16:48 Сейчас в теме
24. YannikAlx 31 11.11.19 17:28 Сейчас в теме
(1) Самый главный вопрос так и не задали автору! Где вы тут увидели ВИРТУАЛЬНУЮ таблицу?
Может все -таки Временная таблица?
26. TODD22 18 11.11.19 17:45 Сейчас в теме
(24)
Самый главный вопрос так и не задали автору! Где вы тут увидели ВИРТУАЛЬНУЮ таблицу?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Вакансии

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

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

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

Автор новостных обзоров на тему 1С и бухучета
Санкт-Петербург
По совместительству

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