|
Левое соединение 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) результат одинаковый
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |