Имя: Пароль:
1C
1С v8
Запрос. Что быстрее?
0 Buster007
 
25.11.11
17:14
ВЫБРАТЬ
   Номенклатура.Ссылка,
   ХарактеристикиНоменклатуры.Ссылка КАК Ссылка1
ИЗ
   Справочник.ХарактеристикиНоменклатуры КАК ХарактеристикиНоменклатуры
       ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура
       ПО ХарактеристикиНоменклатуры.Владелец = Номенклатура.Ссылка
ГДЕ
   Номенклатура.Ссылка В(&МассивНоменклатуры)

ИЛИ

ВЫБРАТЬ
   ХарактеристикиНоменклатуры.Ссылка КАК Ссылка1,
   ВложенныйЗапрос.Ссылка
ИЗ
   (ВЫБРАТЬ
       Номенклатура.Ссылка КАК Ссылка
   ИЗ
       Справочник.Номенклатура КАК Номенклатура
   ГДЕ
       Номенклатура.Ссылка В(&МассивНоменклатуры)) КАК ВложенныйЗапрос
       ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ХарактеристикиНоменклатуры КАК ХарактеристикиНоменклатуры
       ПО ВложенныйЗапрос.Ссылка = ХарактеристикиНоменклатуры.Владелец
1 mirosh
 
25.11.11
17:17
(0) фи, подзапрос в топку. если через временную таблицу его реализовать с индексацией, то будет быстрее
2 H A D G E H O G s
 
25.11.11
17:17
(0) Это разные запросы
3 H A D G E H O G s
 
25.11.11
17:17
(1) tempDB не резиновый!
4 acsent
 
25.11.11
17:17
ВЫБРАТЬ
   ХарактеристикиНоменклатуры.Владелец ,
   ХарактеристикиНоменклатуры.Ссылка КАК Ссылка1
ИЗ
   Справочник.ХарактеристикиНоменклатуры КАК ХарактеристикиНоменклатуры
ГДЕ
   ХарактеристикиНоменклатуры.Владелец В(&МассивНоменклатуры)
5 andrewks
 
25.11.11
17:18
(2) +1
6 Reset
 
25.11.11
17:18
(4) не выведет номенклатуры без характеристик)
7 Buster007
 
25.11.11
17:18
(2) ошибся )
8 acsent
 
25.11.11
17:19
(6) так и (0) не выведет
9 Buster007
 
25.11.11
17:19
(2) имелось ввиду к справочнику номенклатура присоединяется спр. характеристики
10 Нуф-Нуф
 
25.11.11
17:19
вложенные запросы и их авторов на кол
11 H A D G E H O G s
 
25.11.11
17:20
(9) В первом запросе - фактически - ВнутреннеСоединение.
12 mirosh
 
25.11.11
17:20
(3) так удалить же потом
13 Reset
 
25.11.11
17:20
(8) согласен, проглядел
14 Buster007
 
25.11.11
17:20
ВЫБРАТЬ
   Номенклатура.Ссылка,
   ХарактеристикиНоменклатуры.Ссылка КАК Ссылка1
ИЗ
   Справочник.Номенклатура КАК Номенклатура
       ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ХарактеристикиНоменклатуры КАК ХарактеристикиНоменклатуры
       ПО Номенклатура.Ссылка = ХарактеристикиНоменклатуры.Владелец
ГДЕ
   Номенклатура.Ссылка В(&МассивНоменклатуры)
15 Buster007
 
25.11.11
17:20
+(14) вот 1ый вариант и 2ой в 0
16 Нуф-Нуф
 
25.11.11
17:20
не взял бы к себе на работу того кто вложенные юзает
17 Buster007
 
25.11.11
17:21
(16) чем тебе не нравятся вложенные запросы?
18 Axel2009
 
25.11.11
17:21
(1) с чего вдруг быстрее? типа в (0) индексы юзаться не будут?
19 acsent
 
25.11.11
17:22
(17) А смысл их юзать где не попадя?
20 H A D G E H O G s
 
25.11.11
17:22
(12) Так не об этом речь.
Там толпа пользователей сидит, и все юзают эту бедную tempDB (сервер 1С любой чих через них собирает).
А тут ты с Индексами в полный рост.
21 Escander
 
25.11.11
17:22
(18) не будут
22 Escander
 
25.11.11
17:22
(16) И того кто РЛС использует?
23 mirosh
 
25.11.11
17:22
(17)(18) вложенные запросы плохи тем, что сервер не может построить оптимальный план выполнения таких запросов, т.к. не знает заранее размер результирующей таблицы подзапроса. в случае с временной таблцей - иначе. в результате про вложенном запросе скорость может не измениться, а может увеличиться в сотни раз
24 H A D G E H O G s
 
25.11.11
17:23
(17) Подзапрос - это цикл в цикле фактически.
25 acsent
 
25.11.11
17:23
(24) Неправда
26 acsent
 
25.11.11
17:23
Для случая в (0) запросы равносильны (берем MSSQL)
27 mirosh
 
25.11.11
17:24
(20) в данном случае не считаю это проблемой
28 Axel2009
 
25.11.11
17:24
(21) это с чего вдруг не будут то? у каждого справочника есть КЛАСТЕРНЫЙ индекс по полю ссылка.
29 andrewks
 
25.11.11
17:25
интересно, и насколько индекс убыстрит соединение таблиц?
30 H A D G E H O G s
 
25.11.11
17:25
31 Axel2009
 
25.11.11
17:25
(29) он может убыстрить только если индекса НЕТ
32 mirosh
 
25.11.11
17:26
(29) мне тоже :) но что убыстрит - факт
33 acsent
 
25.11.11
17:26
(30) Не подзапрос, а соединение
34 andrewks
 
25.11.11
17:26
(32) а вот мне что-то сомнительно
35 Axel2009
 
25.11.11
17:26
(30) подзапрос в ВЫБРАТЬ - да цикл в цикле. а когда идет соединение, там такого нет. изучаем планы
36 Escander
 
25.11.11
17:26
(28) речь про именно тот индекс который = условию связи, делать его для верменных таблиц при последющем соединении почти всегода даёт выхлоп!
37 Axel2009
 
25.11.11
17:27
(36) я про это же и говорю, по полю ссылка у справочника Номенклатура УЖЕ ЕСТЬ ИНДЕКС и он КЛАСТЕРНЫЙ. поэтому быстрее через временную таблицу не будет на 99.99999999999%
38 Buster007
 
25.11.11
17:28
в данных случая, я могу применить временную таблицу, но если мне надо в этой временной таблице получать по отбору строки?
Именно для этого я и спрашиваю, что будет быстрее, соединять с отобранными данными, или соединять а потом отбирать?
39 mirosh
 
25.11.11
17:29
(38) сначала отбираешь,  уменьшая размер соединяемой таблицы, потом соединяешь.
40 Buster007
 
25.11.11
17:30
(39) так и думал, но надо же было вынести на мисту для уточнения ))
41 Escander
 
25.11.11
17:30
(37)подзапрос или левое?
42 Axel2009
 
25.11.11
17:32
(41) для скуля монопенисуально
43 Axel2009
 
25.11.11
17:32
(38) в данном случае монопенисуально, если речь про скуль сервер
44 andrewks
 
25.11.11
17:33
(11) почему?
45 acsent
 
25.11.11
17:34
(39) Как ты определишь что в первом запросе соединение раньше отбора? Потому что выше написано?
46 mirosh
 
25.11.11
17:34
(43) не согласен, но аргументов привести не могу :)
47 mirosh
 
25.11.11
17:34
(45) я отвечаю на вопрос в (38)
48 Escander
 
25.11.11
17:35
(43)не-а, план выполнения - дело тонкое...
49 Axel2009
 
25.11.11
17:35
(46) ну а я планы запросов в скуле изучал. и там будет нормальное соединение по индексам
50 Buster007
 
25.11.11
17:36
(45) странный вопрос... может ты тогда сейчас будешь утверждать, что преобразуются они и будут идентичны?
51 H A D G E H O G s
 
25.11.11
17:37
Второй запрос (который с подзапросом) привел к Nested Loops. ЧЯДНТ?
52 acsent
 
25.11.11
17:37
(50) План вполне может быть одинаков. Да скорее всего так и будет
53 acsent
 
25.11.11
17:37
(51) А первый?
54 Escander
 
25.11.11
17:39
(51) и подсказки оптимизатору из одынэсе не сделать...
55 H A D G E H O G s
 
25.11.11
17:39
(53) А первый тоже.
56 Axel2009
 
25.11.11
17:39
(51) планы в студию
57 H A D G E H O G s
 
25.11.11
17:39
А похоже все хорошо
58 H A D G E H O G s
 
25.11.11
17:40
SQL соединение отображает как Nested Loops
59 Escander
 
25.11.11
17:40
(55)опа! Временные рулят!!! Что собственно и требовалось доказать
60 Buster007
 
25.11.11
17:41
(56) +1
61 Axel2009
 
25.11.11
17:41
(59) опа у тебя в голове. оба плана одинаковые
(58) nested loops - метод соединения таблиц. и он может быть 3х видов.
62 GoldenDawn
 
25.11.11
17:42
(0)а померять не пробовал? )))
второй конечно, но чтобы замер подтвердил нужны очень большие таблицы
63 Escander
 
25.11.11
17:43
(61)безосновательно, мою парвоту доказывает что вы переходите на личности!
64 Buster007
 
25.11.11
17:43
(62) пробовал, нет такого количества данных, чтобы реально замерить.
65 Axel2009
 
25.11.11
17:43
(62) сам то пробовал?
66 GoldenDawn
 
25.11.11
17:43
и кстати временные таблицы имеют смысл только если не получается или не хочется одним запросом написать
67 H A D G E H O G s
 
25.11.11
17:44
Для первого запроса - Index Scan по Номенклатуре и Index Seek по характеристике.
Для второго запроса - Clustered Index Seek по Номенклатуре и Index scan по Характеристике.
68 Axel2009
 
25.11.11
17:44
(63) зато теперь я знаю какой вопрос можно задавать на собеседование. и отсеивать "знатоков" которые подтверждают свою правоту по косвенным признакам, которые никаким боком на фактах не основаны
69 GoldenDawn
 
25.11.11
17:44
(64)а зачем тему поднял?
70 mirosh
 
25.11.11
17:44
(66) в пакетном запросе можно - будет тоже 1 запрос
71 Axel2009
 
25.11.11
17:45
(67) в массив много вбухал то значений?
72 H A D G E H O G s
 
25.11.11
17:46
(71) 3 номенклатуры.
73 Axel2009
 
25.11.11
17:48
(72) а если первый запрос на внутреннее переделать? и правое, то какие планы?
74 acsent
 
25.11.11
17:49
(67) Странно, ты точно корректный 1 запрос взял, а не тот что в (0)?
75 H A D G E H O G s
 
25.11.11
17:50
(74) Тот что в (0)
76 Buster007
 
25.11.11
17:51
(75) бери тот, что в (14)
77 kuza2000
 
25.11.11
17:58
О, ёштель-моштель, все в кучу, и кони, и яйца, и nested loops сюда же.

SQL - это декларативный язык. Он описывает ЧТО нужно получить, но не описывает КАК. Поэтому говорить "вначале фильтруем", "потом соединяем" нельзя. Что сделает SQL вначале, а что в конце СОВЕРШЕННО не зависит от порядка написания таблиц в запросе. И то, что он раньше сделает действия, описанные в подзапросе - тоже, в общем случае, не верно.
В данном конкретном случае SQL скорее всего сумеет построить оптимальный план запроса в обоих вариантах, так как запрос очень прост и хорошо прогнозируем по статистике промежуточных данных. И очень может быть, что для совершенно по разному написанных запросов, план исполнения будет одинаков! :)
78 Fragster
 
гуру
25.11.11
17:58
так замеры уже былил, или нет?
79 Fragster
 
гуру
25.11.11
17:59
(77) а на файловой - фиг
80 andrewks
 
25.11.11
17:59
(79) на файловой вообще *опа.
81 H A D G E H O G s
 
25.11.11
18:00
Для запроса (14) - Clustered Index Seek по Номенклатуре и Index seek по Характеристике.
82 andrewks
 
25.11.11
18:00
кстати, нужно ещё учитывать многообразие поддерживаемых SQL-СУБД
83 H A D G E H O G s
 
25.11.11
18:01
Ладно, скучно.
Пойду борща поем.
84 acsent
 
25.11.11
18:01
(81) Т.е. планы абсолютно одинаковы, что в принципе и видно сразу было
85 acsent
 
25.11.11
18:02
(83) Прям как бабка из камеди клаб:
Поем борща, послплю,
Посплю, поем борща
86 Axel2009
 
25.11.11
18:05
(84) планы получается разные. в первом случае (правильно) из (14) сик + сик
во втором случае с вложенным запросом из (0) сик + скан
87 Escander
 
25.11.11
18:09
(86) за мс-сиквел не убедили за постгресс и ДБ2 говорить бум?
88 Escander
 
25.11.11
18:10
(67)замеров из ТЖ не осталось? Вот-бы их сравнить с пакетным запросом
89 acsent
 
25.11.11
18:13
(88) а что в пакете то?
90 Escander
 
25.11.11
18:17
(89) то что пытались сунуть в подзапрос: Справочник.Номенклатура
91 acsent
 
25.11.11
18:18
(90) куда быстрее то? seek+seek - самый быстрый, быстрее уже никакк.
сик+скан - чуть медленее. Между ними никаких вариантов не может быть. А временными кудаткут лезть?
92 Escander
 
25.11.11
18:20
(91)>seek+seek
эээ, действительно, индексированный поиск уже быстрей некуда