Имя: Пароль:
1C
 
Что лучше использовать в данном примере ЛЕВОЕ или ВНУТРЕННЕЕ соединение
,
0 Maniac
 
26.03.17
04:49
1. ВНУТРЕННЕЕ 100% (1)
2. ЛЕВОЕ 0% (0)
Всего мнений: 1

Например

1 таблица содержит 10 000 строк.

Нужно получить записи из этой таблицы, которые есть в другой. Это логика внутреннего соединения.

Также эти записи можно получить и ЧЕРЕЗ Левое, потом наложив фильтр на пустое значение.


И возможны ли варианты когда лучше использовать ЛЕВОЕ а в другом случае ВНУТРЕНЕЕ, в зависимости от существенной разницы между таблицами.

Например

Таблица 1 - 10 000 строк
Таблица 2 - 5 000 строк.

Или

Таблица 1 - 10 000 строк
Таблица 2 - 50 000 строк

КОгда лучше использовать то или иное - или не имеет значение размеры таблиц и лучше всегда использовать что то одно.
1 Maniac
 
26.03.17
04:51
Еще что могу добавить

Таблица 1 по составу содержит всего пару колонок. обычная ТЗ
Таблица 2 это таблица со всеми реквизитами Справочника и данными из БД
2 Maniac
 
26.03.17
04:53
Пока что на тестах я ставлю и тот и тот вариант и выдают абсолютно одинаковые результаты. Но ТЗ равно размеру справочника в базе
3 Naf2017
 
26.03.17
05:16
На самом деле от СУБД. Firebird рекомендует INNER, а MS SQL - LEFT

Ну и индексы конечно
4 Maniac
 
26.03.17
05:19
Впиндюлил галку на форме которая меняет запрос. Протетить не могу нормально.
Или база маленькая или хз

Таблицы по 6000 строк соединяются нужными записями в обоих вариантах по 5 секунд

Надо будет проверить у клиентов у которых по 100-200 тысяч
5 Maniac
 
26.03.17
05:21
Просто может быть ситуация что человек грузит накладную в ней 100 строк, а в базе 20 000.

Наверное тут даже без вопросов ЛЕВОЕ рулит.

КОроче сделаю галку с  опцией если в базе 20-30 тысяч чтобы всегда было левое.
А если меньше внутренее
6 Мимохожий Однако
 
26.03.17
08:31
Левое соединение даёт таблицу большего размера, чем внутреннее и потом еще фильтр добавляешь. ИМХО, внутреннее. Где голосовалка? ))
7 Maniac
 
26.03.17
11:49
(6) ничего она больше не дает - если условие поставить будет тоже самое
8 Мимохожий Однако
 
26.03.17
11:56
(7) ВНУТРЕННЕЕ в любом случае меньше по размеру

ВНУТРЕННЕЕ
9 Лефмихалыч
 
26.03.17
12:06
(0) ты уже почитай книжку какую-нибудь, что ли. Это в любом случае будет внутреннее соединение
10 Maniac
 
26.03.17
12:11
(9) Ну смотри ситуация такая - например 10000 строк и они всего есть в базе в которой 100 000 строк.

И допустим все эти 10 000 есть в базе. Те получается почти полное вхождение и особо даже сеять нечего.

Но стоит ли тогда дела внутренее - не отяжелит ли оно запрос ко второй таблице.

В общем на эти и другие ответы надо делать замеры на разных базах в реальных условиях

Пока как писал - провести нормальные тесты не могу
11 Maniac
 
26.03.17
12:12
Задача ладе не сколько получить из левой что есть в правой, а даже сколько заполнить левую несколькими колонками из правой.
12 kumena
 
26.03.17
12:27
(11) так ты уж определись, надо тебе отбор делать или нет. а так я полностью согласен с девятым постом.
13 Лефмихалыч
 
26.03.17
12:30
(10) внутренне и левое с где на поля второй таблицы - это одно и то же.
14 Лефмихалыч
 
26.03.17
12:31
(11) >заполнить левую несколькими колонками из правой.
это - левое

пригласи уже специалиста или сам мануалы почитай.
15 Лефмихалыч
 
26.03.17
12:41
+(13) одно и то же с точки зрения результата. С точки зрения производителельности внутреннее быстрее, т.к. при левом соединении сначала будет получено левое, а потом из него будут выброшены все записи по условию. А при внутреннем вот этой второй операции не будет.

Можно продолжать тыкать пальцем в небо, а можно научиться хотя бы пользоваться консолью запросов Tormozit'овской, которая план запроса показывает. Анализ планов запросов позволит на форуме ахинею не пороть и время не тратить.
16 roman52
 
26.03.17
12:43
ну как бы внутреннее от левого по смыслу отличается:
- если пользователю нужно показать, какие элементы НЕ удалось найти (чтобы ручками указал), то ЛЕВОЕ
- если пользователя нет и нужно обработать только заведомо корректные данные (которые есть в системе, а по некорректным отправить уведомление), то ВНУТРЕННЕЕ
17 Maniac
 
26.03.17
13:14
(16) Отлично! Тогда назову галку - Новый прайс.

И если загружается то чего мало в баще ЛЕВОЕ

А если вся таблица почти полностью есть в 1С т овнутреннее!!
Отлично!!!
18 Лефмихалыч
 
26.03.17
13:59
(17) пусть лучше будет "новый прайс 1".
Танцуешь с дьяволом - танцуй до конца.
19 roman52
 
26.03.17
14:59
(17) когда используешь внутреннее соединение с прайсами, неплохо еще пользователя оповестить об отсеченных внутренним соединениям строках (если таковые были), типа "эти артикулы отсутствуют в базе, поэтому пропущены: (список артикулов)"
20 Maniac
 
26.03.17
15:01
(19) Там дело гораздо проще и удобдней реализована.

У меня ТЗ - там есть колонки с импортом и данные из 1С

1) загружается файл и заполняет эту таблицу
2) Потом я дополняю ее номенклатурой
3) Пустые строки подлежат либо созднию новой номенклатуры либо детальному нечетком поиску если нет прямого соответствия
21 Maniac
 
26.03.17
15:02
Поэтому все это отображается и так далее и тому подобное.

В общем я по опции реализовал. А там на реальных тестах затестим. У всех разные базы, разные ситуации.

У кого то просто 10к товаров, а кто то по 100к грузит.

И опять таки могут быть разные совершенно комбинации между размерами импорта и данными в 1С.
22 spock
 
26.03.17
16:19
Лучше использовать третий вариант - IN (или В):
SELECT tbl1.*
FROM <table1> as tbl1
WHERE
   1 IN (
      SELECT 1
      FROM <table2> as tbl2
      WHERE
         tbl2.<key_fld> = tbl1.<key_fld>
   )

Плюсов у такого подхода больше, чем у первого или второго.
23 Maniac
 
26.03.17
16:26
(22) Это условие.
А у меня в обеих случаях идет дополнение
Так как к первой добавляются данные из второй
24 spock
 
26.03.17
16:32
(23) Я прочитал "Нужно получить записи из этой таблицы, которые есть в другой." и про дополнение ничего не увидел.
25 spock
 
26.03.17
17:32
+24 появилась минутка, прочитал ветку. Если нужны данные из обоих таблиц, то, конечно, join. Причем для mssql не важно какой join будешь использовать left join + where по второй таблице или inner join. У обоих вариантов будет одинаковый план запроса.
26 youalex
 
26.03.17
17:44
(25) +1
если база на скуле - в конечном счете играет план запроса.
Тем более, что в 1С при обращении к СУБД - нельзя использовать хинты. А это значит, что, как минимум, порядок соединений, и используемые индексы - будут определяться оптимизатором запросов скуля, на основании статистики
27 Maniac
 
27.03.17
13:56
Никто не в курсе как быстро получить уникальные значения в определенной колонке не выгружая ТЗ
28 Maniac
 
27.03.17
13:56
и не свертывая
А наверное тему зведу