Вопрос по запросам

1. WKBAPKA 214 14.02.10 15:35 Сейчас в теме
Есть у меня справочник, к которому я делаю запрос. У справочника есть табличная часть. В первоначальном варианте я делал запрос только к реквизитам справочника, а к реквизитам таблчиной части обраращался через ".".

Наример:
Код
ВЫБРАТЬ
 ССЫЛКА
ИЗ Справочник.МойСправочник

...

Фильтры = Выборка.Ссылка.Фильтры;
Показать полностью


Решил оптимизировать, написал запрос типа:
Код
ВЫБРАТЬ
 ССЫЛКА
ИЗ Справочник.МойСправочник
ЛЕВОЕ СОЕДИНЕНИЕ (
ВЫБРАТЬ 
  Ссылка, Субконто
ИЗ
  Справочник.МойСправочник.Фильтры Как Фильтры)
ПО МойСправочник.Ссылка = Фильтры.Ссылка
 ИТОГИ ПО Ссылка
Показать полностью


В итоге получилось, что такой вот подход оказался менее оптимальным!
Проверял на файловом фарианте... разница во времени велика, на 5-10 сек. На клиент-серверном варианте наверное будет не такой разрыв во времени... так все же, что же оптимальнее, обратиться через точку к табличной части, или путем левого соединения получить выборку по ТЧ?
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
19. artbear 1526 20.02.10 21:24 Сейчас в теме
ИМХО в (1) зачем-то юзается вложенный запрос, уже не гуд.
На Скуле наверняка будут другие результаты, чем на файловой.
Автор, ты 100 % уверен, что тебя нигде объекты не кешируются?
2. WKBAPKA 214 14.02.10 15:45 Сейчас в теме
размышления строил на следующих предположениях:

Показатель -> Фильтры показателя

Запрос делаю к фильтрам показателя, а в обходе результата обращаюсь к таблчиной части через точку... на уровне системы - это дополнительное обращение к базе, а что если сделать один запрос, тогда система не будет постоянно обращаться к базе...

только вот по замерам скорости оказалась лажа :cry:
3. пользователь 14.02.10 17:37
Сообщение было скрыто модератором.
...
4. WKBAPKA 214 16.02.10 13:50 Сейчас в теме
5. Трактор 1247 16.02.10 15:17 Сейчас в теме
Запросы непонятные. Урезанные до потери смысла.
6. WKBAPKA 214 16.02.10 22:18 Сейчас в теме
а что тут не понятно... все просто, есть справочник с табличной частью. Задача, нужно выбрать все реквизиты этого справочника, включая все реквизиты табличной части. Что быстрее будет работать, если через запрос выбрать реквизиты справочника без табличной части, а к табличной части обратиться через ссылку, что повлечет за собой еще один запрос на уровне системы, или соединить две таблицы, шапку и табличную часть путем соединения... в моем случае, соединение оказалось значительно медленее, чем простое получение ссылки из выборки и обращение к табличной части через ссылку.
7. k1deniska 17.02.10 17:59 Сейчас в теме
Если оптимально, то:
ВЫБРАТЬ
    МойСправочник.ССЫЛКА,
    ???(Фильтры .Субконто)
ИЗ Справочник.МойСправочник как МойСправочник
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.МойСправочник.Фильтры Как Фильтры 
   ПО МойСправочник.Ссылка = Фильтры.Ссылка
ИТОГИ ПО Ссылка 


но возможно тебе подойдет

ВЫБРАТЬ
    Фильтры.ССЫЛКА,
    ???(Фильтры.Субконто)
ИЗ  Справочник.МойСправочник.Фильтры Как Фильтры 
ИТОГИ ПО Ссылка 
9. WKBAPKA 214 17.02.10 23:21 Сейчас в теме
2(7): Да, но мне нужны все реквизиты шапки, а не только код и наименование, а также ссылка...
2(6): именно так я и написал, что вообщемто и повлекло эту тему, т.к. в этом случае стало работать на глаз медленнее, что меня сильно удивило... удивило потому, что по видеокурсу того же Чистово, рекомендуется явно указывать соединения, а не через точку... т.е. указав явно соедниение я получил увеличение времени запроса...

одним словом, как можно оптимально получить одним запросом реквизиты шапки и табличной части справочника... ну и документа?
11. WKBAPKA 214 18.02.10 11:19 Сейчас в теме
вчера вечером не смог отредактировать свой предыдущий пост...
т.е. ты хочешь сказать, что если я напишу как в (9) получу все реквизиты шапки и ТЧ... но ведь тоже самое я написал в (1), только с явным указанием соединения... как рекомендовал Чистов ...
в принципе, меня интересует скорость
14. k1deniska 19.02.10 11:26 Сейчас в теме
Трактор пишет: (7) при трансляции к базе ...


левое соединение строится для реквизитов табличной части, а не для ссылки на элемент справочника, которому принадлежит табличная часть
8. Трактор 1247 17.02.10 21:19 Сейчас в теме
есть справочник с табличной частью. Задача, нужно выбрать все реквизиты этого справочника, включая все реквизиты табличной части.

Я как-то о таких тонкостях не задумывался и стараюсь не усложнять себе жизнь по пустякам.

Такой запрос:
Выбрать
Фильтры.Ссылка,
Фильтры.Ссылка.Код,
Фильтры.Ссылка.Наименование,
Фильтры.СсылкаНаФильтр,
Фильтры.ЗначениеФильтра
Из
Справочник.МойСправочник.Фильтры Как Фильтры
Показать

При трансляции к базе превратится в такой:

Выбрать
МойСправочник.Ссылка,
МойСправочник.Код,
МойСправочник.Наименование,
Фильтры.СсылкаНаФильтр,
Фильтры.ЗначениеФильтра
Из
МойСправочник Как МойСправочник
ЛевоеСоединение МойСправочникТабличнаячастьФильтры КАК Фильтры
По
МойСправочник.Ссылка = Фильтры.Ссылка
Показать


Вырезки из запросов к серверу тут http://infostart.ru/public/62030/
10. Трактор 1247 17.02.10 23:49 Сейчас в теме
Да, но мне нужны все реквизиты шапки, а не только код и наименование, а также ссылка...

(8)Дык напиши
Выбрать
Фильтры.Ссылка,
Фильтры.Ссылка.*,
Фильтры.СсылкаНаФильтр,
Фильтры.ЗначениеФильтра
Из
Справочник.МойСправочник.Фильтры Как Фильтры 
12. Трактор 1247 18.02.10 11:23 Сейчас в теме
(10)
но ведь тоже самое я написал в (1), только с явным указанием соединения...

Как ни напиши - соединение будет. Однохренственно. Посмотри какие запросы уходят на сервер. Скорей всего одинаковые.
15. Трактор 1247 19.02.10 11:43 Сейчас в теме
(12) >> не совсем "Однохренственно".
Согласен. При запросе по табличной части не увидим элементы с незаполненной табличной частью.

(13) Если делаешь запрос по табличной части, то реквизиты шапки, доступные через Ссылка. подтянутся левым соединением.
13. k1deniska 19.02.10 11:19 Сейчас в теме
Трактор пишет:

(10)


не совсем "Однохренственно".

Есть две разные задачи:
1. Получить все документы со всем содержимым табличной части
и 2. Получить документы у которых заполнена табличная часть

Так вот 1 задача решается через запрос:
ВЫБРАТЬ
    МойСправочник.Ссылка,
    МойСправочник.*,
    Фильтры.СсылкаНаФильтр,
    Фильтры.ЗначениеФильтра
ИЗ Справочник.МойСправочник как МойСправочник
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.МойСправочник.Фильтры Как Фильтры
   ПО МойСправочник.Ссылка = Фильтры.Ссылка
ИТОГИ ПО Ссылка  
Показать

и там где не заполнена табличная часть Фильтры будут null

а вторая задача решается через:

Выбрать
Фильтры.Ссылка,
Фильтры.Ссылка.*, // МойСправочник
Фильтры.СсылкаНаФильтр,
Фильтры.ЗначениеФильтра
Из
Справочник.МойСправочник.Фильтры Как Фильтры 


который потом будет конвертирован к виду:
Выбрать
Фильтры.Ссылка,
МойСправочник.*,
Фильтры.СсылкаНаФильтр,
Фильтры.ЗначениеФильтра
Из
Справочник.МойСправочник.Фильтры Как Фильтры
 ВНУТРЕННЕЕ СОЕДИНЕНИЕ  Справочник.МойСправочник как МойСправочник
      ПО МойСправочник.Ссылка = Фильтры.Ссылка
Показать
16. k1deniska 19.02.10 13:52 Сейчас в теме
согласен, поэтому в результате запроса теоретически он может выдать "объект не найден"
17. WKBAPKA 214 20.02.10 19:41 Сейчас в теме
да, но вот проблема вся в том, что если делать через соединение, то время запроса возрастает настолько, что оказывается быстрее получить реквизиты шапки справочника, а к табличной части обратиться через ссылку уже в обходе результата запроса...
т.е. фактически, быстрее работают два запроса, чем один через соединение...

собственно, это наталкивает на мысль, что те запросы которые система формирует самостоятельно к базе, при обращении через точку к объектным типам данных, работают значительно быстрее...
правда, я пока тестировал это на файловом варианте, может на SQL будет по другому
18. Трактор 1247 20.02.10 21:13 Сейчас в теме
Я торможения при соединениях не замечал. Правда я использую только клиент-серверную версию :D 8-)
20. WKBAPKA 214 21.02.10 01:33 Сейчас в теме
2(18): я не совсем понял вопрос... без соединения я не могу получить реквизиты табличной части... а у меня в справочнике две табличной части... я после замеров, даже на глаз было видно, когда переписал код под запрос, получил увеличение время формирования отчета практически % на 30... т.е. когда я просто делаю запрос к реквизитам справочника, а потом обращаюсь через ссылку к его реквизитам табличной части, работает значительно быстрее... вот что удивило!
21. Fobus2008 12.09.22 17:39 Сейчас в теме
(1) Это не оптимизация, а наоборот … Зачем табличную часть выбирать вложенным запросом? Что мешает соединить две таблицы базы просто левым соединением, чтобы соединение по Ссылка попало в индекс . с вложенным запросом очевидно, что оптимизатор производит соединение перебором .

ВЫБРАТЬ
МойСправочник .ССЫЛКА,
Фильтры .Субконто
ИЗ Справочник.МойСправочник Как МойСправочник
ЛЕВОЕ СОЕДИНЕНИЕ
Справочник.МойСправочник.Фильтры Как Фильтры
ПО МойСправочник.Ссылка = Фильтры.Ссылка
ИТОГИ ПО Ссылка
Оставьте свое сообщение

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