Вход | Регистрация


1С:Предприятие :: 1С:Предприятие 8 общая

Зачем тут соединение в запросе?

Зачем тут соединение в запросе?
Я
   ktibo
 
11.09.18 - 14:03
Всем привет, в одной конфе периодически встречаю что-то типа такой конструкции:

Выбрать

Контрагенты.Ссылка,
Контрагенты.Регион,
Контрагенты.Менеджер,
ТЧ.ВидСкидки,
ТЧ.Скидка
Из Документ.УстановкаСкидок.ТЧ КАК ТЧ
Левое соединение 
Справочник.Контрагенты как Контрагенты
По ТЧ.Контрагент = Контрагенты.Ссылка


Зачем тут соединение, если можно написать просто "ТЧ.Контрагент.Регион", "ТЧ.Контрагент.Менеджер"?
 
 
   PR
 
1 - 11.09.18 - 14:06
(0) Чтобы жестко задать план запроса
   Timon1405
 
2 - 11.09.18 - 14:07
контрагент в ТЧ составной?
   ktibo
 
3 - 11.09.18 - 14:08
(1) т.е. чтобы соединение один раз было выполнено?
   Timon1405
 
4 - 11.09.18 - 14:09
(1) интересно послушать как может меняться план при прочих равных при использовании конструкции ТЧ.Контрагент.Регион
   ktibo
 
5 - 11.09.18 - 14:09
(2) не обратил внимание на это
   maptbln
 
6 - 11.09.18 - 14:11
Может тогда кто объяснить , почему предпочтительней использовать временные таблицы чем вложенные запросы ,
и всегда ли при использовании 2 и более таблиц необходима связь,даже если и без неё всё неплохо работает?
   Borteg
 
7 - 11.09.18 - 14:17
(6) во вложенном запросе не всегда можно посчитать правильно количество строк на выходе, поэтому может неправильно план построится.
   ADirks
 
8 - 11.09.18 - 14:21
(6) Любая неявность может потом вылезти боком, причём непредсказуемо. Поэтому писать всё явно предпочтительнее в целях надёжности и прозрачности для понимания.
   PR
 
9 - 11.09.18 - 14:28
(4) Интересно, найди в Яндексе, скорми звуковому синтезатору и послушай
   Timon1405
 
10 - 11.09.18 - 14:30
(9) синтезатор сломан. интересно послушать именно от автора такого заявления в этой ветке
 
 Рекламное место пустует
   Borteg
 
11 - 11.09.18 - 14:31
(0) результат одинаковый будет, проверил только что на вот таком запросе(план один в один)
SELECT
T1.ФизЛицо,
T2.ДатаРождения,
T2.ИНН,
T2.Пол
FROM Документ.Доверенность T1
LEFT OUTER JOIN Справочник.ФизическиеЛица T2
ON ((T1.ФизЛицо = T2.Ссылка)) AND (T2.ОбластьДанныхОсновныеДанные = ?)
WHERE (T1.ОбластьДанныхОсновныеДанные = ?)
p_0: 0N
p_1: 0N
   Buster007
 
12 - 11.09.18 - 14:32
вы же должны понимать, что тип может непредсказуемо стать составным )
   jsmith82
 
13 - 11.09.18 - 14:32
шах и мат, перфекционисты
   unregistered
 
14 - 11.09.18 - 14:39
(11) Так ФизЛицо - поле составного типа или нет?
Явное прописывание всех соединений вместо использования неявных имеет смысл только, когда ключевые поля (в примере из (0) это Контрагент) имеют составной тип данных.
Точно так же можно было вместо "Контрагенты.Регион" написать в запросе "ВЫРАЗИТЬ(ТЧ.Контрагент КАК Справочник.Контрагенты).Регион".
   Borteg
 
15 - 11.09.18 - 14:40
(14) не составное
ВЫРАЗИТЬ(ТЧ.Контрагент КАК Справочник.Контрагенты).Регион не имеет смысла без  условия на ссылка в где
   PR
 
16 - 11.09.18 - 14:41
(10) Тогда предварительно оплати свой интерес на карточку
Куда тебе удобней, на Сбер, Тиньков, Альфу?
   Timon1405
 
17 - 11.09.18 - 14:43
(16) слив защитан
   ADirks
 
18 - 11.09.18 - 14:47
(12) Вот лучше пусть оно сразу на этом джойне и сломается, чем потом непонятно где. И будешь день искать, что же случилось. Проходили уже.
   unregistered
 
19 - 11.09.18 - 14:50
(15) > не составное

Тогда чего ты ожидал от своего эксперимента в (11)?

> ...не имеет смысла без  условия на ссылка в где

Не совсем понял. О каком условии идёт речь?
   Borteg
 
20 - 11.09.18 - 14:53
(19) Точно так же можно было вместо "Контрагенты.Регион" написать в запросе "ВЫРАЗИТЬ(ТЧ.Контрагент КАК Справочник.Контрагенты).Регион"

Применение конструкции Выразить должно только использоваться вместе с конструкцией где ссылка, тоесть
ВЫРАЗИТЬ(ТЧ.Контрагент КАК Справочник.Контрагенты).Регион
ГДе Тч.Контрагент Ссылка Справочник.Контрагенты

Или это просто бесполезная конструкция и соединение всеравно произойдет по всем полям.
   Borteg
 
21 - 11.09.18 - 14:54
(20) *Строкам
   bolobol
 
22 - 11.09.18 - 14:58
(21) Или типам?
   unregistered
 
23 - 11.09.18 - 14:59
(20) При чем тут поля и строки, если речь идёт о таблицах? Предположим поле "Контрагент" имеет составной тип - например, СправочникСсылка.Контрагенты и СправочникСсылка.ФизическиеЛица. С каким количеством таблиц будет соединена таблица ТЧ когда мы просто запросим поле ТЧ.Контрагент.ИНН, а с каким количеством таблиц, если запросим ВЫЫРАЗИТЬ(ТЧ.Кнтрагент КАК Справочник.Контрагенты).ИНН?
ИМХО, в первом случае неявное соединение будет с обеими таблицами - и с Контрагенты и с ФизическиеЛица, а во втором случае - только с Контрагенты.
   PR
 
24 - 11.09.18 - 15:00
(17) Подари мне Бентли
   Timon1405
 
25 - 11.09.18 - 15:12
(24) Долгову покажи тему, может премию выдаст
   Borteg
 
26 - 11.09.18 - 15:20
(23) путаешь немного запрос с планом выполнения этого запроса.
Оптимизатор SQL всегда убирает недействительные соединения.

Если ты укажешь в условии где Ссылка на тип документа,то соединений в запросе будет много, но план запроса будет построен правильно и эти соединения не будут участвовать, т.к. в условии будет передан тип справочника для соединения, и все недействительные соединения отсекутся оптимизатором SQL.
А вот если использовать Выразить, то просто для несовпадающего типа будет NULL и это может повлиять например на результат запроса,т.к присутствовать NULL.

В целом конструкция выразить вообще никак не влияет на производительность сама по себе.
   unregistered
 
27 - 11.09.18 - 15:27
(26) При чем тут план запроса?...
Я тебе про Фому, ты мне пр Ерёму.
Разыменовывание полей при помощи ВЫРАЗИТЬ() или явное прописывание всех связей, как в (0), имеет смысл для корректного построения текста запроса, который 1С передаст серверу SQL. Без этого 1С построит текст запроса, в котором будут соединения со всеми(!) таблицами, которые могут хранить данные составного типа (если поле может принимать 2 типа - значит с 2-мя, если 50, то 50-тью)

https://its.1c.ru/db/v8std#content:2149184303:hdoc
   Timon1405
 
28 - 11.09.18 - 15:27
(26) выполните в консоли
ВЫБРАТЬ ПЕРВЫЕ 1
    выразить(ТоварыНаСкладах.Регистратор как Документ.ПоступлениеТоваровУслуг).Номер
ИЗ
    РегистрНакопления.ТоварыНаСкладах КАК ТоварыНаСкладах

УПОРЯДОЧИТЬ ПО
    ТоварыНаСкладах.Период УБЫВ
и 
ВЫБРАТЬ ПЕРВЫЕ 1
    ТоварыНаСкладах.Регистратор.Номер
ИЗ
    РегистрНакопления.ТоварыНаСкладах КАК ТоварыНаСкладах

УПОРЯДОЧИТЬ ПО
    ТоварыНаСкладах.Период УБЫВ
и посмотрите план
   Вафель
 
29 - 11.09.18 - 15:30
может писатель не знал, что в 1с можно через точку и это нормально?
   RomanYS
 
30 - 11.09.18 - 15:32
Если отбросить ситуации, когда это действительно влияет (поля составного типа), есть ещё субъективный критерий читаемости запроса. Если в запросе берется много полей из справочника, я бы тоже сделал как (0). По мне "Контрагенты.Менеджер" читается лучше чем "ТЧ.Контрагент.Менеджер КАК Менеджер".
   Вафель
 
31 - 11.09.18 - 15:34
(30) поля лучше читаются, а соединения хуже. так что паритет
   nicxxx
 
32 - 11.09.18 - 15:43
(1) херню сказал
(0) если тип в ТЧ.Контрагент расширится, станет составным, то этот запрос будет продолжать работать с одним справочником, а не со всем, возможными в этом поле, как было при обращении через две точки.
   Borteg
 
33 - 11.09.18 - 15:52
(27) Эм а как ты оцениваешь что происходит на субд? по запросу чтоли?
 
 
   RomanYS
 
34 - 11.09.18 - 16:37
(31) Поэтому я и писал "много полей". Бывают ситуации, когда удобнее вообще написать "Контрагенты.*"


Список тем форума
Рекламное место пустует  Рекламное место пустует
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух.
Фредерик Брукс-младший
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует