Как наиболее эффективно выбрать Договоры контрагентов по которым есть движения в некоторых регистрах
Есть документ с табличной частью в тч реквизит "ДоговорКонтрагента". Есть 2(3,4,5) Регистра накопления (бухгалтерии), у каждого в измерениях(субконто) есть "Договор контрагента". Нужно выбрать только те договора из документа, по которым были движения в регистрах. ТЧ может быть большой (несколько десятков тысяч записей), количество данных в регистрах - огромное. Нужен оптимальный запрос.
По теме из базы знаний
- Концепция автоматизации многопрофильного Холдинга в системе АУБ на платформе 1С
- Не спеша, эффективно и правильно – путь разработки. Часть 2. Теория
- Распространенные ошибки разработчиков, приводящие к проблемам производительности
- Исправляем проблемы производительности в конфигурации ERP - 7 примеров
- Переход с УПП на ERP с сохранением документов. Фантастика или реальность?
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(2) Такой запрос тормозит. Еще осложняется тем, что из одного регистра нужно выбрать только движения, зарегистрированные определенным типом документа и поэтому использование таблицы оборотов для него бессмысленно. Даже не знаю в какую сторону копать. Приведу запросы, может я че не так понимаю:
первый запрос просто эмулирует выборку из документа. получается 42000 записей. Потом Объединение различных. С оборотами в РН облом, но кстати это большой вклад во время выполнения не внесло (пробовал брать из оборотов - время незначительно упало)
Кстати другой запрос с соединениями выполняется за то же время
первый запрос просто эмулирует выборку из документа. получается 42000 записей. Потом Объединение различных. С оборотами в РН облом, но кстати это большой вклад во время выполнения не внесло (пробовал брать из оборотов - время незначительно упало)
ВЫБРАТЬ
ДоговорыКонтрагентов.Ссылка КАК ДоговорКонтрагента
ПОМЕСТИТЬ ВТ_Договоры
ИЗ
Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
ГДЕ
ДоговорыКонтрагентов.Наименование ПОДОБНО &Наименование
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
ХозрасчетныйОбороты.Субконто2 КАК ДоговорКонтрагента
ПОМЕСТИТЬ ВТ_ДоговорыСПроводками
ИЗ
РегистрБухгалтерии.Хозрасчетный.Обороты(
,
,
,
Счет В ИЕРАРХИИ (&Счет62),
,
Субконто2 В
(ВЫБРАТЬ
ВТ_Договоры.ДоговорКонтрагента
ИЗ
ВТ_Договоры КАК ВТ_Договоры),
,
) КАК ХозрасчетныйОбороты
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ВзаиморасчетыСКонтрагентамиПоАренде.ДоговорКонтрагента
ИЗ
РегистрНакопления.ВзаиморасчетыСКонтрагентамиПоАренде КАК ВзаиморасчетыСКонтрагентамиПоАренде
ГДЕ
ВзаиморасчетыСКонтрагентамиПоАренде.Активность
И ВзаиморасчетыСКонтрагентамиПоАренде.Регистратор ССЫЛКА Документ.ПлатежноеПоручениеВходящее
И ВзаиморасчетыСКонтрагентамиПоАренде.ДоговорКонтрагента В
(ВЫБРАТЬ
ВТ_Договоры.ДоговорКонтрагента
ИЗ
ВТ_Договоры КАК ВТ_Договоры)
ПоказатьКстати другой запрос с соединениями выполняется за то же время
ВЫБРАТЬ
ДоговорыКонтрагентов.Ссылка КАК ДоговорКонтрагента
ПОМЕСТИТЬ ВТ_Договоры
ИЗ
Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
ГДЕ
ДоговорыКонтрагентов.Наименование ПОДОБНО &Наименование
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
ВТ_Договоры.ДоговорКонтрагента
ПОМЕСТИТЬ ВТ_ДоговорыСПроводками
ИЗ
ВТ_Договоры КАК ВТ_Договоры
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Хозрасчетный.Обороты(
,
,
,
Счет В ИЕРАРХИИ (&Счет62),
,
Субконто2 В
(ВЫБРАТЬ
ВТ_Договоры.ДоговорКонтрагента
ИЗ
ВТ_Договоры КАК ВТ_Договоры),
,
) КАК ХозрасчетныйОбороты
ПО ВТ_Договоры.ДоговорКонтрагента = ХозрасчетныйОбороты.Субконто2
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
ВТ_ДоговорыСПроводками.ДоговорКонтрагента
ИЗ
ВТ_ДоговорыСПроводками КАК ВТ_ДоговорыСПроводками
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ВзаиморасчетыСКонтрагентамиПоАренде КАК ВзаиморасчетыСКонтрагентамиПоАренде
ПО ВТ_ДоговорыСПроводками.ДоговорКонтрагента = ВзаиморасчетыСКонтрагентамиПоАренде.ДоговорКонтрагента
И (ВзаиморасчетыСКонтрагентамиПоАренде.Активность)
И (ВзаиморасчетыСКонтрагентамиПоАренде.Регистратор ССЫЛКА Документ.ПлатежноеПоручениеВходящее)
Показать
(7) может быть по всякому
(8) -нет эфекта
(9) 1. укажи явно тип Субконто2 - минус 4 сек. теперь 12 с выполняется. 2. добавь РАЗЛИЧНЫЕ ПЕРВЫЕ xxx - я так данные потеряю
(10) тогда уж рс с ресурсом "ЕстьДвижения", в который писать истину, когда появляются движения. есть один минус - это не тот отчет под который конфу переписывают
(8) -нет эфекта
(9) 1. укажи явно тип Субконто2 - минус 4 сек. теперь 12 с выполняется. 2. добавь РАЗЛИЧНЫЕ ПЕРВЫЕ xxx - я так данные потеряю
(10) тогда уж рс с ресурсом "ЕстьДвижения", в который писать истину, когда появляются движения. есть один минус - это не тот отчет под который конфу переписывают
Обороты РН можно использовать, в параметрах виртуальной таблицы проставить Периодичность = Регистратор.
Субконто2 - составного типа, нужно его привести к нужному с помощью ВЫРАЗИТЬ(... КАК ...).
Хотя, это все может и не сильный прирост производительности дать... надо пробовать
Субконто2 - составного типа, нужно его привести к нужному с помощью ВЫРАЗИТЬ(... КАК ...).
Хотя, это все может и не сильный прирост производительности дать... надо пробовать
(22) 32ops, Зависит от СУБД и от количества элементов в ВТ_Договоры и ВТ_ХозрасчетныйОбороты. Просто план запроса может получится более оптимальный с таким способом, там же в РБ данные в куче таблиц хранится, ещё и составной тип данных.
У меня на MS SQL Server 2008 при большом количестве элементов быстрее раза в 2, при небольшом так же. Вроде, за счет использования параллелизма и создания хеш-таблицы.
У меня на MS SQL Server 2008 при большом количестве элементов быстрее раза в 2, при небольшом так же. Вроде, за счет использования параллелизма и создания хеш-таблицы.
Вот примерно такой вариант можно попробовать:
ВЫБРАТЬ
ДоговорыКонтрагентов.Ссылка КАК Ссылка
ПОМЕСТИТЬ ВТ_Договоры
ИЗ
Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
ВЫРАЗИТЬ(ХозрасчетныйОбороты.Субконто1 КАК Справочник.ДоговорыКонтрагентов) КАК ДоговорКонтрагента
ПОМЕСТИТЬ ВТ_ХозрасчетныйОбороты
ИЗ
РегистрБухгалтерии.Хозрасчетный.Обороты(, , , Счет В ИЕРАРХИИ (&Счет62), ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконтоХозрасчетные.Договоры), , , ) КАК ХозрасчетныйОбороты
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
ВТ_ХозрасчетныйОбороты.ДоговорКонтрагента
ИЗ
ВТ_ХозрасчетныйОбороты КАК ВТ_ХозрасчетныйОбороты
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_Договоры КАК ВТ_Договоры
ПО ВТ_ХозрасчетныйОбороты.ДоговорКонтрагента = ВТ_Договоры.Ссылка
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот