Имя: Пароль:
1C
1С v8
Внутренне соединение или оператор В
,
0 Почему 1С
 
10.02.21
15:15
ВЫБРАТЬ
    Контрагент.Ссылка КАК Контрагент
ПОМЕСТИТЬ ВТ
ИЗ
    Справочник.Контрагент КАК Контрагент

ИНДЕКСИРОВАТЬ ПО
    Контрагент
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ПоступлениеДенег.СуммаПоступления КАК СуммаПоступления
ИЗ
    Документ.ПоступлениеДенег КАК ПоступлениеДенег
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ КАК ВТ
        ПО ПоступлениеДенег.Контрагент = ВТ.Контрагент
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ПоступлениеДенег.СуммаПоступления КАК СуммаПоступления
ИЗ
    Документ.ПоступлениеДенег КАК ПоступлениеДенег
ГДЕ
    ПоступлениеДенег.Контрагент В
            (ВЫБРАТЬ
                ВТ.Контрагент
            ИЗ
                ВТ КАК ВТ)

Если поле контрагент документа не индексированное, есть ли разница в быстродействии запросов 1 и 2?
1 Почему 1С
 
10.02.21
15:19
Вопрос возник в курилке, я обычно использую соединение, а коллега оператор В, так прикинули что и там и тут будет перебор, но в моем случае есть индекс по маленькой таблице, на что коллега парировал что согласно рекомендаций 1с индекс будет иметь смысл только в большей таблице при внутреннем соединении
2 Guk
 
10.02.21
15:25
взяли да замерили производительность того и другого варианта, чего спорить-то...
3 Почему 1С
 
10.02.21
15:28
Про замер была идея, но вопрос интересен не с экспериментальной точки зрения, а с точки зрения теории. Если даже узнаем что лучше, вопрос почему останется.
4 Guk
 
10.02.21
15:30
(3) если брать в теории, то 1С не рекомендует использовать вложенные запросы и стараться максимально обходиться без них. но у этой теории есть много противников...
5 H A D G E H O G s
 
10.02.21
15:31
Тут будет хороша аксиома Эскобара.

Индексировать ВТ не нужно почти никогда.
6 Guk
 
10.02.21
15:31
хотя именно в твоем запросе, я никакого криминала в использовании вложенного запроса не вижу...
7 Гобсек
 
10.02.21
15:34
Экономить нужно не не только время процессора но и лично свое время. Вложенные запросы труднее отлаживать. Поэтому первый вариант предпочтительнее.
8 Почему 1С
 
10.02.21
15:35
(5) В левом соединении когда временная таблица справа, нужно - будет эффективнее
    во внутреннем соединении когда временная таблица большая - тоже будет эффективнее это если верить 1С https://its.1c.ru/db/v8std/content/658/hdoc
9 Guk
 
10.02.21
15:36
вот статейка на эту тему...
http://catalog.mista.ru/1c/articles/1218921/
10 H A D G E H O G s
 
10.02.21
15:37
Я для себя выделил 3 правила:
1) Любая Виртуальная таблица, к которой будет соединение (явно, или через точку) - выбирается в ВТ.
2) Фильтрую ВнутреннимСоединением вместо В()
3) Если нужно соединить больше 3 и более таблицы - соединеняем через Временную таблицу сначало 2-ые 2, потом еще с одной.
11 H A D G E H O G s
 
10.02.21
15:38
(8) Нет.
Индексы могут помочь только для Соединения на неравенство.
12 Почему 1С
 
10.02.21
15:40
(9) спасибо за статью интересная тема
13 Почему 1С
 
10.02.21
15:42
(11) Не понял почему, ведь индексы эффективны в первую очередь на равенство, а неравенство это тоже равенство с НЕ
14 Guk
 
10.02.21
15:45
эта, гуру, заканчивайте путать виртуальные и временные таблицы. глаза режет...
15 Почему 1С
 
10.02.21
15:47
(9) Вывод временные таблицы индексировать не нужно в 99%, потому что индексы хороши когда построил индекс и потом часто им пользуешься, а во временной таблице использовал один раз и строй заново.
День прошел не зря.
16 H A D G E H O G s
 
10.02.21
15:50
(15) Нет.
Там дофига ньюансов, общий смысл в том, что большая ВТ - плохо само по себе, а маленьких реальных таблиц и нет обычно.
17 VladZ
 
10.02.21
15:56
(0) А теперь то же самое, но на реальной задаче.
18 novichok79
 
10.02.21
16:16
(0) а так вы свое писькомерство на форум решили вынести, еще и курилка... тут не до таблиц, имхо, здоровье важнее.
если серьезно, возьмите да замерьте, посмотрите план запроса.
тема не имеет смысла без объема данных и планов запроса.
от себя:
В для фильтрации не использую, ибо был случай в практике, что такое В породило 180 секунд ожидания, вместо 3х на inner join'е
ну и там разименования не надо юзать, смотреть где у нас индексы есть и все такое.
19 Classic
 
10.02.21
17:13
(0)
В общем случае разные результаты. Оператор "В" не множит строки
20 rozer76
 
10.02.21
20:37
С какой-то версии платформы 8.3 "В" преобразуется в inner join
21 rozer76
 
10.02.21
20:48
+(20) Ну не всегда а если в "В" свыше определенного количества элементов
22 Сергиус
 
10.02.21
20:58
(3)Ну если интересует именно с точки зрения теории, то достаточно посмотреть типовые конфы - и там в 99% случаев будут временные таблицы.
23 Курцвейл
 
10.02.21
20:58
(1) Коллега прав. Если выборка маленькая, то лучше отказаться от индекса.
24 Жан Пердежон
 
10.02.21
21:05
(20) а пруф будет?
в общем случае это разные и не взаимозаменяемые операции
25 rozer76
 
10.02.21
21:35
(24) можете проверить в профайлере- 10000 элементов должно хватить для "превращения"
26 Малыш Джон
 
10.02.21
22:10
(0) 1. Разница есть (странно, если бы её не было, это два разных плана запроса)
2. У какого способа преимущество в быстродействии - зависит.
27 ДедМорроз
 
10.02.21
22:26
Интересно сравнивать когда В &МассивЭлементов,то есть чистое В,а не в подзапросе.
28 ДедМорроз
 
10.02.21
22:28
Ну и у sql хранение таблиц по кластерному индексу,то есть таблица будет индексирована по полям,когда будет сохраняться.
29 H A D G E H O G s
 
10.02.21
22:51
30 H A D G E H O G s
 
10.02.21
22:56
(27) Точно также, IN
Но при этом создается индексированная ВТ и туда Bulk Insert загоняется массив.
http://prntscr.com/z07ou5
http://prntscr.com/z07qwd

Индекс при этом бессмысленен.
31 youalex
 
11.02.21
00:56
(20) Это, скорее всего,  про списки/массивы в параметрах.
Т.е если условие типа  ГДЕ Спр.Ссылка в (&СписокКонтрагентов), то при большом количестве элементов, список не литералами вставляется в запрос СУБД, а во временную таблицу, которая джойнится.

если же условие вида  ГДЕ Спр.Ссылка В (ВЫБРАТЬ Различные Контрагент ИЗ Документ.Поступление) - сомневаюсь что 1С будет преобразовывать условие IN() в JOIN
32 youalex
 
11.02.21
01:16
(31) + >> во временную таблицу, которая джойнится.

Судя по (30), в этом случае все равно IN()
Но почти уверен, что на ранних версиях 8.2 видел именно JOIN, и "поштучные" Insert`ы. Могу ошибаться)
33 rozer76
 
11.02.21
08:11
>>Т.е если условие типа  ГДЕ Спр.Ссылка в (&СписокКонтрагентов), то при большом количестве элементов, список не литералами вставляется в запрос СУБД, а во временную таблицу, которая джойнится.

да, именно, а не когда IN() из ВТ
34 Почему 1С
 
11.02.21
08:42
В нашем случае основная таблица около 82000 строк таблица в операторе IN (порядка 5000)

К сожалению профайлер не доступен, если тупо замерять разницу то ее нет на нашем объеме данных