Имя: Пароль:
1C
1С v8
Левое соединение VS условие В
,
0 vi0
 
13.01.13
17:09
Есть 2 запроса, где условие на выбираемые документы сделано через левое соединение и через условие В. Левое соединение работает в несколько раз быстрее.
Вопрос такой: т.к. "В" более читабельное (особенно когда есть несколько подобных условий) то как реализовать условие В чтобы оно работало оптимально?

обсуждение в тему:
http://partners.v8.1c.ru/forum/thread.jsp?id=691758


МЕДЛЕННЫЙ ЗАПРОС (несколько секунд):
ВЫБРАТЬ
       Доверенность.ДокументРасчетов КАК Док
ПОМЕСТИТЬ ДокументыРасчетов
ИЗ
       Документ.Доверенность.ДокументыРасчетов КАК Доверенность
ГДЕ
       Доверенность.Ссылка = &ДокументСсылка
       И ТИПЗНАЧЕНИЯ(Доверенность.ДокументРасчетов) = ТИП(Документ.Реализация)

;

ВЫБРАТЬ
       Товары.Сумма
ИЗ
       Документ.Реализация.Товары КАК Товары
ГДЕ
       Товары.Ссылка В
           (ВЫБРАТЬ
             ДокументыРасчетов.Док
           ИЗ
             ДокументыРасчетов)

БЫСТРЫЙ ЗАПРОС (доли секунды):
ВЫБРАТЬ РАЗЛИЧНЫЕ
       Доверенность.ДокументРасчетов КАК Док
ПОМЕСТИТЬ ДокументыРасчетов
ИЗ
       Документ.Доверенность.ДокументыРасчетов КАК Доверенность
ГДЕ
       Доверенность.Ссылка = &ДокументСсылка
       И ТИПЗНАЧЕНИЯ(Доверенность.ДокументРасчетов) = ТИП(Документ.Реализация)

;
ВЫБРАТЬ
   Товары.Сумма
ИЗ
   ДокументыРасчетов КАК ДокументыРасчетов
ЛЕВОЕ СОЕДИНЕНИЕ Документ.Реализация.Товары КАК Товары
   ПО ДокументыРасчетов.Док = Товары.Ссылка
1 eklmn
 
гуру
13.01.13
17:12
а что будет работать быстрее запрос в цикле (вар1) или вложеный запрос(вар2)?
2 eklmn
 
гуру
13.01.13
17:15
"
ГДЕ
       Товары.Ссылка В
           (ВЫБРАТЬ
             ДокументыРасчетов.Док
           ИЗ
             ДокументыРасчетов ГДЕ ТОвары.Ссылка = ДокументыРасчетов.Товары.Ссылка)
"

предположения...
3 vicof
 
13.01.13
17:36
(0) В первом случае отбираются доверенности. Затем выбираются все реализации и доверенности, и только потом на них накладывается условие.
Во втором случае выбираются доверенности, затем происходит соединение таблиц без всяких условий, т.е. "отбор" идет на уровне соединения таблиц.

Плюс кошернее вместо
ТИПЗНАЧЕНИЯ(Доверенность.ДокументРасчетов) = ТИП(Документ.Реализация)
писать
Доверенность.ДокументРасчетов ССЫЛКА Документ.Реализация
4 Нуф-Нуф
 
13.01.13
17:38
индексация? не?
5 Sammo
 
13.01.13
17:42
По опыту - конструкция В у меня превращалась в 2 разные конструкции в скуле, в зависимости от статистики. Левое всегда оставлялось левым.

Кстати, имхо соединение более читабельно, чем конструкция В
6 vi0
 
13.01.13
17:48
(2) на чем основаны предположения?
7 vi0
 
13.01.13
17:50
(3) почему считаешь, что условие накладывается потом? обычное условие же

чем кошернее?
8 vi0
 
13.01.13
17:51
(4) не, индексация не помогает (которая для временной таблицы)
9 vi0
 
13.01.13
17:52
(5) если условие типа В несколько то читать запрос становится сложно. для меня по крайней мере
10 vi0
 
13.01.13
17:52
(5) в какие конструкции превращалось В ?
11 Sorm
 
13.01.13
17:55
(0) "В"  реализуй через временную таблицу с индексацией и джойн:) Чем больше данных в запросе - тем больше "В" будет отставать от джойна
12 vi0
 
13.01.13
17:57
кстати, в моем конкретном реальном случае временная таблица содержала всего одну запись
13 Sorm
 
13.01.13
17:58
У тебя запрос по источнику "В" будет выполнятся для каждой записи первичной таблицы.
14 eklmn
 
гуру
13.01.13
18:01
(6) (13)+в (2) надо устанавливать фильтр в ручную, так мы получим подобие ЛЕВОГО СОЕДИНЕНИЯ
15 vicof
 
14.01.13
02:59
(7) 1. Потому что сначала выберутся данные, потом будет пройдена каждая запись и сделан отбор по условию вхождения.
А во втором варианте записи отбираются прямо во время соединения.
2. Потому что оператор ССЫЛКА именно для этого предназначен.
16 vi0
 
14.01.13
09:05
(15)  1. на чем основываешь этот вывод?
17 vi0
 
14.01.13
09:08
(15) повторюсь, временная таблица содержит всего одну строку
18 Defender aka LINN
 
14.01.13
09:16
(15) А для чего же тогда предназначен оператор ТИПЗНАЧЕНИЯ?
Кроме того, ТИПЗНАЧЕНИЯ не вызовет ошибки, если поле не содержит такого типа, в отличие от ссылки.
19 spock
 
14.01.13
10:03
(0)Запросы не равнозначны так-то.
20 vi0
 
14.01.13
16:26
(19) результат одинаковый
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан