Есть у меня справочник, к которому я делаю запрос. У справочника есть табличная часть. В первоначальном варианте я делал запрос только к реквизитам справочника, а к реквизитам таблчиной части обраращался через ".".
Наример:
Решил оптимизировать, написал запрос типа:
В итоге получилось, что такой вот подход оказался менее оптимальным!
Проверял на файловом фарианте... разница во времени велика, на 5-10 сек. На клиент-серверном варианте наверное будет не такой разрыв во времени... так все же, что же оптимальнее, обратиться через точку к табличной части, или путем левого соединения получить выборку по ТЧ?
Наример:
Код |
---|
ВЫБРАТЬ
ССЫЛКА
ИЗ Справочник.МойСправочник
...
Фильтры = Выборка.Ссылка.Фильтры;
Показать полностью |
Решил оптимизировать, написал запрос типа:
Код |
---|
ВЫБРАТЬ
ССЫЛКА
ИЗ Справочник.МойСправочник
ЛЕВОЕ СОЕДИНЕНИЕ (
ВЫБРАТЬ
Ссылка, Субконто
ИЗ
Справочник.МойСправочник.Фильтры Как Фильтры)
ПО МойСправочник.Ссылка = Фильтры.Ссылка
ИТОГИ ПО Ссылка
Показать полностью |
В итоге получилось, что такой вот подход оказался менее оптимальным!
Проверял на файловом фарианте... разница во времени велика, на 5-10 сек. На клиент-серверном варианте наверное будет не такой разрыв во времени... так все же, что же оптимальнее, обратиться через точку к табличной части, или путем левого соединения получить выборку по ТЧ?
По теме из базы знаний
- Курсы валют на разные даты в одном запросе. Делаем свой нестандартный срез последних.
- Помощник ЕГАИС для 1С:Розница 2.2/2.3. Инвентаризация, запросы, проверка ТТН
- Как читать чужой код? Часть 1. Общие вопросы. Доработка чужого кода. Code review
- Генератор текста запроса
- Начните уже использовать хранилище запросов
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
размышления строил на следующих предположениях:
Показатель -> Фильтры показателя
Запрос делаю к фильтрам показателя, а в обходе результата обращаюсь к таблчиной части через точку... на уровне системы - это дополнительное обращение к базе, а что если сделать один запрос, тогда система не будет постоянно обращаться к базе...
только вот по замерам скорости оказалась лажа :cry:
Показатель -> Фильтры показателя
Запрос делаю к фильтрам показателя, а в обходе результата обращаюсь к таблчиной части через точку... на уровне системы - это дополнительное обращение к базе, а что если сделать один запрос, тогда система не будет постоянно обращаться к базе...
только вот по замерам скорости оказалась лажа :cry:
а что тут не понятно... все просто, есть справочник с табличной частью. Задача, нужно выбрать все реквизиты этого справочника, включая все реквизиты табличной части. Что быстрее будет работать, если через запрос выбрать реквизиты справочника без табличной части, а к табличной части обратиться через ссылку, что повлечет за собой еще один запрос на уровне системы, или соединить две таблицы, шапку и табличную часть путем соединения... в моем случае, соединение оказалось значительно медленее, чем простое получение ссылки из выборки и обращение к табличной части через ссылку.
Если оптимально, то:
но возможно тебе подойдет
ВЫБРАТЬ
МойСправочник.ССЫЛКА,
???(Фильтры .Субконто)
ИЗ Справочник.МойСправочник как МойСправочник
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.МойСправочник.Фильтры Как Фильтры
ПО МойСправочник.Ссылка = Фильтры.Ссылка
ИТОГИ ПО Ссылка
но возможно тебе подойдет
ВЫБРАТЬ
Фильтры.ССЫЛКА,
???(Фильтры.Субконто)
ИЗ Справочник.МойСправочник.Фильтры Как Фильтры
ИТОГИ ПО Ссылка
2(7): Да, но мне нужны все реквизиты шапки, а не только код и наименование, а также ссылка...
2(6): именно так я и написал, что вообщемто и повлекло эту тему, т.к. в этом случае стало работать на глаз медленнее, что меня сильно удивило... удивило потому, что по видеокурсу того же Чистово, рекомендуется явно указывать соединения, а не через точку... т.е. указав явно соедниение я получил увеличение времени запроса...
одним словом, как можно оптимально получить одним запросом реквизиты шапки и табличной части справочника... ну и документа?
2(6): именно так я и написал, что вообщемто и повлекло эту тему, т.к. в этом случае стало работать на глаз медленнее, что меня сильно удивило... удивило потому, что по видеокурсу того же Чистово, рекомендуется явно указывать соединения, а не через точку... т.е. указав явно соедниение я получил увеличение времени запроса...
одним словом, как можно оптимально получить одним запросом реквизиты шапки и табличной части справочника... ну и документа?
есть справочник с табличной частью. Задача, нужно выбрать все реквизиты этого справочника, включая все реквизиты табличной части.
Я как-то о таких тонкостях не задумывался и стараюсь не усложнять себе жизнь по пустякам.
Такой запрос:
Выбрать
Фильтры.Ссылка,
Фильтры.Ссылка.Код,
Фильтры.Ссылка.Наименование,
Фильтры.СсылкаНаФильтр,
Фильтры.ЗначениеФильтра
Из
Справочник.МойСправочник.Фильтры Как Фильтры
ПоказатьПри трансляции к базе превратится в такой:
Выбрать
МойСправочник.Ссылка,
МойСправочник.Код,
МойСправочник.Наименование,
Фильтры.СсылкаНаФильтр,
Фильтры.ЗначениеФильтра
Из
МойСправочник Как МойСправочник
ЛевоеСоединение МойСправочникТабличнаячастьФильтры КАК Фильтры
По
МойСправочник.Ссылка = Фильтры.Ссылка
ПоказатьВырезки из запросов к серверу тут
не совсем "Однохренственно".
Есть две разные задачи:
1. Получить все документы со всем содержимым табличной части
и 2. Получить документы у которых заполнена табличная часть
Так вот 1 задача решается через запрос:
ВЫБРАТЬ
МойСправочник.Ссылка,
МойСправочник.*,
Фильтры.СсылкаНаФильтр,
Фильтры.ЗначениеФильтра
ИЗ Справочник.МойСправочник как МойСправочник
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.МойСправочник.Фильтры Как Фильтры
ПО МойСправочник.Ссылка = Фильтры.Ссылка
ИТОГИ ПО Ссылка
Показатьи там где не заполнена табличная часть Фильтры будут null
а вторая задача решается через:
Выбрать
Фильтры.Ссылка,
Фильтры.Ссылка.*, // МойСправочник
Фильтры.СсылкаНаФильтр,
Фильтры.ЗначениеФильтра
Из
Справочник.МойСправочник.Фильтры Как Фильтры
который потом будет конвертирован к виду:
Выбрать
Фильтры.Ссылка,
МойСправочник.*,
Фильтры.СсылкаНаФильтр,
Фильтры.ЗначениеФильтра
Из
Справочник.МойСправочник.Фильтры Как Фильтры
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.МойСправочник как МойСправочник
ПО МойСправочник.Ссылка = Фильтры.Ссылка
Показать
да, но вот проблема вся в том, что если делать через соединение, то время запроса возрастает настолько, что оказывается быстрее получить реквизиты шапки справочника, а к табличной части обратиться через ссылку уже в обходе результата запроса...
т.е. фактически, быстрее работают два запроса, чем один через соединение...
собственно, это наталкивает на мысль, что те запросы которые система формирует самостоятельно к базе, при обращении через точку к объектным типам данных, работают значительно быстрее...
правда, я пока тестировал это на файловом варианте, может на SQL будет по другому
т.е. фактически, быстрее работают два запроса, чем один через соединение...
собственно, это наталкивает на мысль, что те запросы которые система формирует самостоятельно к базе, при обращении через точку к объектным типам данных, работают значительно быстрее...
правда, я пока тестировал это на файловом варианте, может на SQL будет по другому
2(18): я не совсем понял вопрос... без соединения я не могу получить реквизиты табличной части... а у меня в справочнике две табличной части... я после замеров, даже на глаз было видно, когда переписал код под запрос, получил увеличение время формирования отчета практически % на 30... т.е. когда я просто делаю запрос к реквизитам справочника, а потом обращаюсь через ссылку к его реквизитам табличной части, работает значительно быстрее... вот что удивило!
(1) Это не оптимизация, а наоборот … Зачем табличную часть выбирать вложенным запросом? Что мешает соединить две таблицы базы просто левым соединением, чтобы соединение по Ссылка попало в индекс . с вложенным запросом очевидно, что оптимизатор производит соединение перебором .
ВЫБРАТЬ
МойСправочник .ССЫЛКА,
Фильтры .Субконто
ИЗ Справочник.МойСправочник Как МойСправочник
ЛЕВОЕ СОЕДИНЕНИЕ
Справочник.МойСправочник.Фильтры Как Фильтры
ПО МойСправочник.Ссылка = Фильтры.Ссылка
ИТОГИ ПО Ссылка
ВЫБРАТЬ
МойСправочник .ССЫЛКА,
Фильтры .Субконто
ИЗ Справочник.МойСправочник Как МойСправочник
ЛЕВОЕ СОЕДИНЕНИЕ
Справочник.МойСправочник.Фильтры Как Фильтры
ПО МойСправочник.Ссылка = Фильтры.Ссылка
ИТОГИ ПО Ссылка
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот