|
Внутренне соединение или оператор В | ☑ | ||
---|---|---|---|---|
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
|
(25) Неа
http://prntscr.com/z076qe |
|||
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)
К сожалению профайлер не доступен, если тупо замерять разницу то ее нет на нашем объеме данных |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |