|
Что лучше использовать в данном примере ЛЕВОЕ или ВНУТРЕННЕЕ соединение | ☑ | ||||||
---|---|---|---|---|---|---|---|---|
0
Maniac
26.03.17
✎
04:49
|
Например
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
|
и не свертывая
А наверное тему зведу |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |