|   |   | 
| 
 | Запрос. Что быстрее? | ☑ | ||
|---|---|---|---|---|
| 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 
  эээ, действительно, индексированный поиск уже быстрей некуда | 
 
 | Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |