|
Вопрос по левому соединению | ☑ | ||
---|---|---|---|---|
0
mzelensky
14.11.12
✎
11:06
|
Вроде вопрос простой, но хочетсяуточнить механизм...
Есть Таблица1 и таблица2. Выбираем запросов данные из Таблица1 и левым соединением цепляем к ней Таблицу2. Ну например: Выбрать Таблица1.Реквизит1, Таблица2.Реквизит1 Из Таблица1 как Таблица1 Левое Соединение Таблица2 как Таблица2 По Таблица1.Реквизит1 = Таблица2.Реквизит1 Итак, вопрос - каким образом будет формироваться выборка из таблица2? Т.е. Из нее возьмутся ВСЕ данные (получим большую таблицу), а потом на эту таблицу будут накладываться ограницения "ПО"....или первоначальная выборка данных из таблицы2 будет изначально формироваться с отбором (т.е. сразу с ограничением) ?!?!?! |
|||
1
GLazNik
14.11.12
✎
11:08
|
(0) зависит от размера таблиц. Может сперва отобрать все записи из таблицы 1, а потом наложить отбор на таблицу 2, а может и наоборот.
|
|||
2
Конфигуратор1с
14.11.12
✎
11:08
|
(0)Щас тебя в профайл отправят
|
|||
3
Irek-kazan
14.11.12
✎
11:09
|
это уж как оптимизатор решит
|
|||
4
mzelensky
14.11.12
✎
11:09
|
(1) это как? два алгоритма в зависимости от размера? и какой пороГ!
|
|||
5
mikecool
14.11.12
✎
11:10
|
вротмненоги...
LEFT OUTER JOIN Оператор левого внешнего соединения LEFT OUTER JOIN соединяет две таблицы. Порядок таблиц для оператора важен, поскольку оператор не является симметричным. Заголовок таблицы-результата является объединением (конкатенацией) заголовков соединяемых таблиц. Тело результата логически формируется следующим образом. Пусть выполняется соединение левой и правой таблиц по предикату (условию) p. В результат включается внутреннее соединение (INNER JOIN) левой и правой таблиц по предикату p. Затем в результат добавляются те записи левой таблицы, которые не вошли во внутреннее соединение на шаге 1. Для таких записей поля, соответствующие правой таблице, заполняются значениями NULL. |
|||
6
mzelensky
14.11.12
✎
11:11
|
(3) аналогичнй вопрос...и как он может решить? в зависимости от чего?
|
|||
7
Maxus43
14.11.12
✎
11:11
|
(4)>(3) оптимизатор решает всё, на него влиять ты можеш только косвенно, например обновляя статистику СКЛ, и писать грамотные запросы
|
|||
8
mikecool
14.11.12
✎
11:11
|
ну ладно не знаешь, но поискать бы хоть попробовал
|
|||
9
Конфигуратор1с
14.11.12
✎
11:11
|
(4)насколько я понял, 1сина сама строит скульный запрос так как считает более оптимально. А как по ее мнению оптимально это даже Нуралиевы не знают
|
|||
10
GLazNik
14.11.12
✎
11:11
|
(4) это (3). порог.. а хз... тут уже SQL работает (а это (2))
|
|||
11
Maxus43
14.11.12
✎
11:12
|
(8) ты есть, нафиг искать ещё
|
|||
12
GLazNik
14.11.12
✎
11:13
|
(9) нене... одинесина как раз таки транслирует запрос один в один, а вот скульный оптимизатор уже и решает, как оно лучше...
|
|||
13
acsent
14.11.12
✎
11:14
|
если есть индекс на т2 по реквизит 1 то будет индекс сик
|
|||
14
acsent
14.11.12
✎
11:15
|
если нет индекса, то тэйбл скан
|
|||
15
acsent
14.11.12
✎
11:15
|
Хотя я думаю ты и слов то таких не знаешь, про какие то выборки говоришь.
|
|||
16
mzelensky
14.11.12
✎
11:15
|
(5) вообще-то ,то что ты вывалил совершенно не отвечает на мой вопрос! так что сумничить не получилось у тебя
|
|||
17
GLazNik
14.11.12
✎
11:17
|
вот... для затравки http://msdn.microsoft.com/ru-ru/library/ms190623(v=sql.105).aspx
|
|||
18
mzelensky
14.11.12
✎
11:18
|
(15) еще один умник. Не поверишь наверное, но знаю
|
|||
19
Maxus43
14.11.12
✎
11:18
|
(18) нафига тогда спрашиваеш? это всё смотрится в профайлере, и про оптимизатор чего спрашиваеш?)
|
|||
20
mzelensky
14.11.12
✎
11:19
|
(19) спросить здесь было быстрее
|
|||
21
GANR
14.11.12
✎
11:20
|
(0) На этот вопрос ответит анализ плана запроса (в 1С - нету MS SQL).
|
|||
22
mzelensky
14.11.12
✎
11:21
|
(19) он ведь в (5) действительно не ответил на вопрос...фраза
"Тело результата логически формируется следующим образом. Пусть выполняется соединение левой и правой таблиц по предикату (условию) p." а точнее условие по предикату может выполняться либо до полной выборки, либо после. А когда как именно я хотел узнать. |
|||
23
GLazNik
14.11.12
✎
11:24
|
(22) В зависимости от используемой базы данных "когда и как именно" может иметь разительные отличия. Поэтому относить к этому как к "черному ящику"
|
|||
24
Maxus43
14.11.12
✎
11:24
|
(22) ответ в (1)(2)(3) же, или мы телепаты оптимизаторов скульных? много критериев, зависит от конкретной БД
|
|||
25
mzelensky
14.11.12
✎
11:26
|
Понятно. Всем спасибо!
|
|||
26
mr_K
14.11.12
✎
11:39
|
Можно вклиниться в высокоумную беседу? Спасибо! ))
Из темы вытекает такой вопрос: есть общая рекомендация не делать левых соединений с (ВЫБРАТЬ...), а сначала из второй таблицы отобрать во временную и соединять уже с ней. И для того, чтобы понять пользоваться этим советом или нет в каждом конкретном случае нужно знать, что сначала, как спрашивает автор: полная выборка или условие связи. Потому как если первая таблица имеет десятки строк, а вторая таблица имеет миллион строк, а по условиям связи нужна одна для каждой из первой, то имхо как-то неоптимально выбирать весь миллион во временную. Прокомментируйте плиз. |
|||
27
mzelensky
14.11.12
✎
11:50
|
(26) это и послужило причиной вопроса. +
|
|||
28
Ёпрст
14.11.12
✎
11:51
|
(0)это в любом случае декартово произведение 2-х табличек + выборка с помощью элемента ON + "добавление внешних строк"
|
|||
29
samozvanec
14.11.12
✎
11:55
|
настоящий кодер сам управляет условием выборки и соединением
|
|||
30
mzelensky
14.11.12
✎
11:57
|
(29) ты просто нереальный кодер ) респект тебе и уважуха! Да будет у тебя зп от 100500 и прекланяются перд тобой все Нуралиевы! Ты просто мега чел!
|
|||
31
narayanan
14.11.12
✎
12:14
|
(30) милионы пафоса детектед
|
|||
32
cViper
14.11.12
✎
12:21
|
(0) кури оптимизатор конкретной субд на которой стоит 1с
|
|||
33
mzelensky
14.11.12
✎
12:23
|
(32) ну давай курить вместе 2 самых распространеннх варианта:
1) Файловая база 2) Базана MS SQL |
|||
34
cViper
14.11.12
✎
12:24
|
(33) версии MS SQL тоже сильно отличаются
|
|||
35
mr_K
14.11.12
✎
12:27
|
Пообщался с нашими SQL-ками. Ответ такое: если нужно получить стабильно удовлетворительный результат - то все сначала во временную с индексами по полям связи и потом джойн с ней. Если хочется получить оптимальный результат - то смотреть как индексы построены, и далее отдавать все на откуп оптимизатору SQL. Потому как оптимизатор SQL может работать совершенно по разному в зависимости даже не от версии SQL, а от определенного сервис пака. И получится, что запрос, который ты оптимизировал под один сервиспак и увидел по нему оптимальный план, на другом сервиспаке будет иметь абсолютно другой план.
Вот как-то так |
|||
36
mr_K
14.11.12
✎
12:30
|
(33) Для файловой базы однозначно сначала выборка, потом условие.
|
|||
37
mzelensky
14.11.12
✎
12:43
|
(35) а точ, что от больших временных темп у базы пухнет, эт ничего?
|
|||
38
mr_K
14.11.12
✎
12:58
|
(37) Теже SQL-щики привели пример, который видели собственными глазами: здоровенный запрос, куча джойнов с селектами, в плане запроса оптимизатор сам создал несколько временных таблиц.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |