Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Внутренне соединение или оператор В

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

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

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

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

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

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

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

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

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

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

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


Список тем форума
 
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.