Имя: Пароль:
1C
1С v8
Вопрос по левому соединению
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
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-щики привели пример, который видели собственными глазами: здоровенный запрос, куча джойнов с селектами, в плане запроса оптимизатор сам создал несколько временных таблиц.
2 + 2 = 3.9999999999999999999999999999999...