|
Зачем тут соединение в запросе? | ☑ | ||
---|---|---|---|---|
0
ktibo
11.09.18
✎
14:03
|
Всем привет, в одной конфе периодически встречаю что-то типа такой конструкции:
Выбрать Контрагенты.Ссылка, Контрагенты.Регион, Контрагенты.Менеджер, ТЧ.ВидСкидки, ТЧ.Скидка Из Документ.УстановкаСкидок.ТЧ КАК ТЧ Левое соединение Справочник.Контрагенты как Контрагенты По ТЧ.Контрагент = Контрагенты.Ссылка Зачем тут соединение, если можно написать просто "ТЧ.Контрагент.Регион", "ТЧ.Контрагент.Менеджер"? |
|||
1
PR
11.09.18
✎
14:06
|
(0) Чтобы жестко задать план запроса
|
|||
2
Timon1405
11.09.18
✎
14:07
|
контрагент в ТЧ составной?
|
|||
3
ktibo
11.09.18
✎
14:08
|
(1) т.е. чтобы соединение один раз было выполнено?
|
|||
4
Timon1405
11.09.18
✎
14:09
|
(1) интересно послушать как может меняться план при прочих равных при использовании конструкции ТЧ.Контрагент.Регион
|
|||
5
ktibo
11.09.18
✎
14:09
|
(2) не обратил внимание на это
|
|||
6
maptbln
11.09.18
✎
14:11
|
Может тогда кто объяснить , почему предпочтительней использовать временные таблицы чем вложенные запросы ,
и всегда ли при использовании 2 и более таблиц необходима связь,даже если и без неё всё неплохо работает? |
|||
7
Borteg
11.09.18
✎
14:17
|
(6) во вложенном запросе не всегда можно посчитать правильно количество строк на выходе, поэтому может неправильно план построится.
|
|||
8
ADirks
11.09.18
✎
14:21
|
(6) Любая неявность может потом вылезти боком, причём непредсказуемо. Поэтому писать всё явно предпочтительнее в целях надёжности и прозрачности для понимания.
|
|||
9
PR
11.09.18
✎
14:28
|
(4) Интересно, найди в Яндексе, скорми звуковому синтезатору и послушай
|
|||
10
Timon1405
11.09.18
✎
14:30
|
(9) синтезатор сломан. интересно послушать именно от автора такого заявления в этой ветке
|
|||
11
Borteg
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 |
|||
12
Buster007
11.09.18
✎
14:32
|
вы же должны понимать, что тип может непредсказуемо стать составным )
|
|||
13
jsmith82
11.09.18
✎
14:32
|
шах и мат, перфекционисты
|
|||
14
unregistered
11.09.18
✎
14:39
|
(11) Так ФизЛицо - поле составного типа или нет?
Явное прописывание всех соединений вместо использования неявных имеет смысл только, когда ключевые поля (в примере из (0) это Контрагент) имеют составной тип данных. Точно так же можно было вместо "Контрагенты.Регион" написать в запросе "ВЫРАЗИТЬ(ТЧ.Контрагент КАК Справочник.Контрагенты).Регион". |
|||
15
Borteg
11.09.18
✎
14:40
|
(14) не составное
ВЫРАЗИТЬ(ТЧ.Контрагент КАК Справочник.Контрагенты).Регион не имеет смысла без условия на ссылка в где |
|||
16
PR
11.09.18
✎
14:41
|
(10) Тогда предварительно оплати свой интерес на карточку
Куда тебе удобней, на Сбер, Тиньков, Альфу? |
|||
17
Timon1405
11.09.18
✎
14:43
|
(16) слив защитан
|
|||
18
ADirks
11.09.18
✎
14:47
|
(12) Вот лучше пусть оно сразу на этом джойне и сломается, чем потом непонятно где. И будешь день искать, что же случилось. Проходили уже.
|
|||
19
unregistered
11.09.18
✎
14:50
|
(15) > не составное
Тогда чего ты ожидал от своего эксперимента в (11)? > ...не имеет смысла без условия на ссылка в где Не совсем понял. О каком условии идёт речь? |
|||
20
Borteg
11.09.18
✎
14:53
|
(19) Точно так же можно было вместо "Контрагенты.Регион" написать в запросе "ВЫРАЗИТЬ(ТЧ.Контрагент КАК Справочник.Контрагенты).Регион"
Применение конструкции Выразить должно только использоваться вместе с конструкцией где ссылка, тоесть ВЫРАЗИТЬ(ТЧ.Контрагент КАК Справочник.Контрагенты).Регион ГДе Тч.Контрагент Ссылка Справочник.Контрагенты Или это просто бесполезная конструкция и соединение всеравно произойдет по всем полям. |
|||
21
Borteg
11.09.18
✎
14:54
|
(20) *Строкам
|
|||
22
bolobol
11.09.18
✎
14:58
|
(21) Или типам?
|
|||
23
unregistered
11.09.18
✎
14:59
|
(20) При чем тут поля и строки, если речь идёт о таблицах? Предположим поле "Контрагент" имеет составной тип - например, СправочникСсылка.Контрагенты и СправочникСсылка.ФизическиеЛица. С каким количеством таблиц будет соединена таблица ТЧ когда мы просто запросим поле ТЧ.Контрагент.ИНН, а с каким количеством таблиц, если запросим ВЫЫРАЗИТЬ(ТЧ.Кнтрагент КАК Справочник.Контрагенты).ИНН?
ИМХО, в первом случае неявное соединение будет с обеими таблицами - и с Контрагенты и с ФизическиеЛица, а во втором случае - только с Контрагенты. |
|||
24
PR
11.09.18
✎
15:00
|
(17) Подари мне Бентли
|
|||
25
Timon1405
11.09.18
✎
15:12
|
(24) Долгову покажи тему, может премию выдаст
|
|||
26
Borteg
11.09.18
✎
15:20
|
(23) путаешь немного запрос с планом выполнения этого запроса.
Оптимизатор SQL всегда убирает недействительные соединения. Если ты укажешь в условии где Ссылка на тип документа,то соединений в запросе будет много, но план запроса будет построен правильно и эти соединения не будут участвовать, т.к. в условии будет передан тип справочника для соединения, и все недействительные соединения отсекутся оптимизатором SQL. А вот если использовать Выразить, то просто для несовпадающего типа будет NULL и это может повлиять например на результат запроса,т.к присутствовать NULL. В целом конструкция выразить вообще никак не влияет на производительность сама по себе. |
|||
27
unregistered
11.09.18
✎
15:27
|
(26) При чем тут план запроса?...
Я тебе про Фому, ты мне пр Ерёму. Разыменовывание полей при помощи ВЫРАЗИТЬ() или явное прописывание всех связей, как в (0), имеет смысл для корректного построения текста запроса, который 1С передаст серверу SQL. Без этого 1С построит текст запроса, в котором будут соединения со всеми(!) таблицами, которые могут хранить данные составного типа (если поле может принимать 2 типа - значит с 2-мя, если 50, то 50-тью) https://its.1c.ru/db/v8std#content:2149184303:hdoc |
|||
28
Timon1405
11.09.18
✎
15:27
|
(26) выполните в консоли
ВЫБРАТЬ ПЕРВЫЕ 1 выразить(ТоварыНаСкладах.Регистратор как Документ.ПоступлениеТоваровУслуг).Номер ИЗ РегистрНакопления.ТоварыНаСкладах КАК ТоварыНаСкладах УПОРЯДОЧИТЬ ПО ТоварыНаСкладах.Период УБЫВ и ВЫБРАТЬ ПЕРВЫЕ 1 ТоварыНаСкладах.Регистратор.Номер ИЗ РегистрНакопления.ТоварыНаСкладах КАК ТоварыНаСкладах УПОРЯДОЧИТЬ ПО ТоварыНаСкладах.Период УБЫВ и посмотрите план |
|||
29
Вафель
11.09.18
✎
15:30
|
может писатель не знал, что в 1с можно через точку и это нормально?
|
|||
30
RomanYS
11.09.18
✎
15:32
|
Если отбросить ситуации, когда это действительно влияет (поля составного типа), есть ещё субъективный критерий читаемости запроса. Если в запросе берется много полей из справочника, я бы тоже сделал как (0). По мне "Контрагенты.Менеджер" читается лучше чем "ТЧ.Контрагент.Менеджер КАК Менеджер".
|
|||
31
Вафель
11.09.18
✎
15:34
|
(30) поля лучше читаются, а соединения хуже. так что паритет
|
|||
32
nicxxx
11.09.18
✎
15:43
|
(1) херню сказал
(0) если тип в ТЧ.Контрагент расширится, станет составным, то этот запрос будет продолжать работать с одним справочником, а не со всем, возможными в этом поле, как было при обращении через две точки. |
|||
33
Borteg
11.09.18
✎
15:52
|
(27) Эм а как ты оцениваешь что происходит на субд? по запросу чтоли?
|
|||
34
RomanYS
11.09.18
✎
16:37
|
(31) Поэтому я и писал "много полей". Бывают ситуации, когда удобнее вообще написать "Контрагенты.*"
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |