Как наиболее эффективно выбрать Договоры контрагентов по которым есть движения в некоторых регистрах

1. 32ops 192 27.07.16 11:09 Сейчас в теме
Есть документ с табличной частью в тч реквизит "ДоговорКонтрагента". Есть 2(3,4,5) Регистра накопления (бухгалтерии), у каждого в измерениях(субконто) есть "Договор контрагента". Нужно выбрать только те договора из документа, по которым были движения в регистрах. ТЧ может быть большой (несколько десятков тысяч записей), количество данных в регистрах - огромное. Нужен оптимальный запрос.
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. PetroP 27.07.16 11:43 Сейчас в теме
Более оптимального, чем выборка различных из каждого регистра с объединением сложно придумать.
Если такой запрос будет тормозить, тогда надо думать над изменением структуры бд.
3. 32ops 192 27.07.16 13:05 Сейчас в теме
(2) Такой запрос тормозит. Еще осложняется тем, что из одного регистра нужно выбрать только движения, зарегистрированные определенным типом документа и поэтому использование таблицы оборотов для него бессмысленно. Даже не знаю в какую сторону копать. Приведу запросы, может я че не так понимаю:
первый запрос просто эмулирует выборку из документа. получается 42000 записей. Потом Объединение различных. С оборотами в РН облом, но кстати это большой вклад во время выполнения не внесло (пробовал брать из оборотов - время незначительно упало)
ВЫБРАТЬ
	ДоговорыКонтрагентов.Ссылка КАК ДоговорКонтрагента
ПОМЕСТИТЬ ВТ_Договоры
ИЗ
	Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
ГДЕ
	ДоговорыКонтрагентов.Наименование ПОДОБНО &Наименование
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ХозрасчетныйОбороты.Субконто2 КАК ДоговорКонтрагента
ПОМЕСТИТЬ ВТ_ДоговорыСПроводками
ИЗ
	РегистрБухгалтерии.Хозрасчетный.Обороты(
			,
			,
			,
			Счет В ИЕРАРХИИ (&Счет62),
			,
			Субконто2 В
				(ВЫБРАТЬ
					ВТ_Договоры.ДоговорКонтрагента
				ИЗ
					ВТ_Договоры КАК ВТ_Договоры),
			,
			) КАК ХозрасчетныйОбороты

ОБЪЕДИНИТЬ

ВЫБРАТЬ
	ВзаиморасчетыСКонтрагентамиПоАренде.ДоговорКонтрагента
ИЗ
	РегистрНакопления.ВзаиморасчетыСКонтрагентамиПоАренде КАК ВзаиморасчетыСКонтрагентамиПоАренде
ГДЕ
	ВзаиморасчетыСКонтрагентамиПоАренде.Активность
	И ВзаиморасчетыСКонтрагентамиПоАренде.Регистратор ССЫЛКА Документ.ПлатежноеПоручениеВходящее
	И ВзаиморасчетыСКонтрагентамиПоАренде.ДоговорКонтрагента В
			(ВЫБРАТЬ
				ВТ_Договоры.ДоговорКонтрагента
			ИЗ
				ВТ_Договоры КАК ВТ_Договоры)
Показать


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

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВТ_Договоры.ДоговорКонтрагента
ПОМЕСТИТЬ ВТ_ДоговорыСПроводками
ИЗ
	ВТ_Договоры КАК ВТ_Договоры
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Хозрасчетный.Обороты(
				,
				,
				,
				Счет В ИЕРАРХИИ (&Счет62),
				,
				Субконто2 В
					(ВЫБРАТЬ
						ВТ_Договоры.ДоговорКонтрагента
					ИЗ
						ВТ_Договоры КАК ВТ_Договоры),
				,
				) КАК ХозрасчетныйОбороты
		ПО ВТ_Договоры.ДоговорКонтрагента = ХозрасчетныйОбороты.Субконто2
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
	ВТ_ДоговорыСПроводками.ДоговорКонтрагента
ИЗ
	ВТ_ДоговорыСПроводками КАК ВТ_ДоговорыСПроводками
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ВзаиморасчетыСКонтрагентамиПоАренде КАК ВзаиморасчетыСКонтрагентамиПоАренде
		ПО ВТ_ДоговорыСПроводками.ДоговорКонтрагента = ВзаиморасчетыСКонтрагентамиПоАренде.ДоговорКонтрагента
			И (ВзаиморасчетыСКонтрагентамиПоАренде.Активность)
			И (ВзаиморасчетыСКонтрагентамиПоАренде.Регистратор ССЫЛКА Документ.ПлатежноеПоручениеВходящее)
Показать
4. PetroP 27.07.16 13:15 Сейчас в теме
(3) 32ops, вы попробуйте проверить, сколько будет выполняться первый пакетный запрос. Тормоза у вас здесь:
ГДЕ
    ДоговорыКонтрагентов.Наименование ПОДОБНО &Наименование
5. 32ops 192 27.07.16 13:16 Сейчас в теме
(4) PetroP, проверил конечно, нет. тормоза на втором запросе
6. 32ops 192 27.07.16 13:20 Сейчас в теме
(4) Кстати тормоза именно на регистре бухгалтерии. Изменил объединение на выбрать различные из РН - без тормозов. Если оставить только РБ - тормоза
9. Fox-trot 158 27.07.16 13:28 Сейчас в теме
(3) 32ops,
1. укажи явно тип Субконто2
2. добавь РАЗЛИЧНЫЕ ПЕРВЫЕ xxx
7. ipoloskov 162 27.07.16 13:26 Сейчас в теме
Не смотрите регистр бухгалтерии, ничего вы там с быстродействием не сделаете. Или по каким-то документам движение по РБ есть, а по РН нет?
12. 32ops 192 27.07.16 13:39 Сейчас в теме
(7) может быть по всякому
(8) -нет эфекта
(9) 1. укажи явно тип Субконто2 - минус 4 сек. теперь 12 с выполняется. 2. добавь РАЗЛИЧНЫЕ ПЕРВЫЕ xxx - я так данные потеряю
(10) тогда уж рс с ресурсом "ЕстьДвижения", в который писать истину, когда появляются движения. есть один минус - это не тот отчет под который конфу переписывают
8. NeviD 27.07.16 13:28 Сейчас в теме
Обороты РН можно использовать, в параметрах виртуальной таблицы проставить Периодичность = Регистратор.
Субконто2 - составного типа, нужно его привести к нужному с помощью ВЫРАЗИТЬ(... КАК ...).
Хотя, это все может и не сильный прирост производительности дать... надо пробовать
10. ipoloskov 162 27.07.16 13:30 Сейчас в теме
Лучше всего сделать свой непериодический регистр сведений с измерениями
- Договор
- Документ
- Номер строки,
делать движения по нему при проведении документов и анализировать только его.
11. NeviD 27.07.16 13:33 Сейчас в теме
В параметрах виртуальной таблицы нужно заполнить Субконто нужным видом субконто.
13. NeviD 27.07.16 13:39 Сейчас в теме
Ещё вариант попробовать можно: Из РБ получать все Договора во временную таблицу. Потом внутренним соединением соединять с нужными нам договорами.
Должно работать быстрее при большом количестве договоров.
14. 32ops 192 27.07.16 13:42 Сейчас в теме
(13) Работает также (если имеется ввиду второй вариант из (3) )
15. NeviD 27.07.16 13:46 Сейчас в теме
Тип Субконто в виртуальной таблице пробовал прописать?
Например, ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконтоХозрасчетные.Договоры)
16. 32ops 192 27.07.16 13:48 Сейчас в теме
(15) Да пробовал, это помогло, но все равно тормозит. До субконто - 16 сек, после - 12 сек
17. NeviD 27.07.16 13:51 Сейчас в теме
(16) 32ops, Сколько договоров в ВТ_Договоры примерно?
18. horoshevall 27.07.16 13:57 Сейчас в теме
(16) 32ops, Попробуйте еще таблицу с договорами проиндексировать.
20. 32ops 192 28.07.16 05:35 Сейчас в теме
(18) - от 0 до плюс 5 сек к выполнению, игрался с разными запросами, ничего не вышло, но индексацию оставил в одном из вариантов, который не дал проигрыша
(19) в чем суть я не понял. Выбрать сначала все (всего договоров много больше чем в ВТ_договоры) , потом отфильтровать. Пробовать не стал.
21. NeviD 28.07.16 09:51 Сейчас в теме
(20) 32ops, Совершенно верно. Почему пробовать не стал?
22. 32ops 192 28.07.16 11:53 Сейчас в теме
(21) Хм, странный результат. 14 сек. Не лучший по времени, но и не худший. Я ожидал улета за минуту.
23. NeviD 28.07.16 12:02 Сейчас в теме
(22) 32ops, Зависит от СУБД и от количества элементов в ВТ_Договоры и ВТ_ХозрасчетныйОбороты. Просто план запроса может получится более оптимальный с таким способом, там же в РБ данные в куче таблиц хранится, ещё и составной тип данных.
У меня на MS SQL Server 2008 при большом количестве элементов быстрее раза в 2, при небольшом так же. Вроде, за счет использования параллелизма и создания хеш-таблицы.
19. NeviD 27.07.16 14:00 Сейчас в теме
Вот примерно такой вариант можно попробовать:

ВЫБРАТЬ
	ДоговорыКонтрагентов.Ссылка КАК Ссылка
ПОМЕСТИТЬ ВТ_Договоры
ИЗ
	Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВЫРАЗИТЬ(ХозрасчетныйОбороты.Субконто1 КАК Справочник.ДоговорыКонтрагентов) КАК ДоговорКонтрагента
ПОМЕСТИТЬ ВТ_ХозрасчетныйОбороты
ИЗ
	РегистрБухгалтерии.Хозрасчетный.Обороты(, , , Счет В ИЕРАРХИИ (&Счет62), ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконтоХозрасчетные.Договоры), , , ) КАК ХозрасчетныйОбороты
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВТ_ХозрасчетныйОбороты.ДоговорКонтрагента
ИЗ
	ВТ_ХозрасчетныйОбороты КАК ВТ_ХозрасчетныйОбороты
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_Договоры КАК ВТ_Договоры
		ПО ВТ_ХозрасчетныйОбороты.ДоговорКонтрагента = ВТ_Договоры.Ссылка
Показать
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот