Скорость запроса. Что быстрее?

  1. 8 г. назад

    Первый

    ВЫБРАТЬ
    	РеализацияТоваровУслугТовары.Номенклатура,
    	РеализацияТоваровУслугТовары.Количество
    ИЗ
    	Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
    ГДЕ
    	РеализацияТоваровУслугТовары.Ссылка.Склад = &Склад

    Второй

    ВЫБРАТЬ
    	РеализацияТоваровУслугТовары.Номенклатура,
    	РеализацияТоваровУслугТовары.Количество
    ИЗ
    	Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
    		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
    		ПО РеализацияТоваровУслугТовары.Ссылка = РеализацияТоваровУслуг.Ссылка
    	        И РеализацияТоваровУслуг.Склад = &пСклад
    Ответы: (1) (20) (62) (80)
  2. 02.06.2015 20:07:48 отредактировано sda553

    (0) ваще без разницы, т.к.
    1. 1С все равно сделает соединение при транслировании запроса и отправке на сервер
    2. sql server сам подбирает оптимальный план исполнения запроса, и скорее всего он будет одинаков в обоих случаях

    Ответы: (2)
  3. (1) Та тут столкнулся (плохое слово) с оптимизатором - запрещает мне (программистам фирмы) писать первый вариант требует всегда второй.

    Ответы: (3) (61)
  4. (2) оптимизатор - это человек?

    Ответы: (4)
  5. (3) хуже. Женщина ...

    Ответы: (5)
  6. 02.06.2015 20:13:54 отредактировано sda553

    (4) ну в чем то она права. Но дело тут не в оптимальности выполнения запроса, а скорее в (!) унификации и (прости господи) симплификации кода. Пускай она изучает диски, рекомендации 1С по написанию кода, планирует код в соответствии с будущими планами и обновлениями 1С и т.д. Грязная работа, а вы можете сбросить с себя это и просто слушать ее рекомендации.

    Ответы: (6)
  7. (5) А интересно, как 1Ска затранслирует запрос, если будет множественное условие в "ГДЕ" ?

    Ответы: (7)
  8. 02.06.2015 20:19:11 отредактировано sda553

    (6) нормально транслирует. Есть такая вещь как профайлер https://msdn.microsoft.com/ru-ru/library/ms181091.aspx которым ты можешь трассировкой обращений к sql серверу посмотреть что вытворяет 1С-ка и как она транслирует твой код. Довольно познавательно посмотреть
    http://www.mssqltips.com/tipimages2/1841_profiler.jpg

    Ответы: (8)
  9. (7) я знаю шо это и как его готовят, но мне лениво смотреть ...

  10. я согласен с оптимизатором, неявных соединений быть не должно.
    но мне не совсем понятно, для чего в варианте №1 искусственно введено неявное соединение, а в варианте №2 его героически разрешают

    Ответы: (13)
  11. Аргументация должна быть проще: включаешь тех журнал, запускаешь по очереди оба запроса и показываешь Ж, что 1с их транслирует в sql одинаково.
    Ps меня забрили на одном из собеседований, потому как сделал как п2.

    Ответы: (11)
  12. sf меня забрили на одном из собеседований, потому как сделал как п2.

    неадекваты :)

    Ответы: (12)
  13. (11) я был молод, только интуицией мог объяснить.
    А то зубры БКС. Конечно, это не единственный вопрос был)

  14. 02.06.2015 21:22:01 отредактировано MIK

    (9) неявное соединение табличной части с ее ссылкой? что за чушь

    Ответы: (14) (22)
  15. (13) ты лучше скажи, планы запросов одинаковые будут?

    Ответы: (15)
  16. (14) думаю да, в любом случае там где нет составных реквизитов все довольно просто

  17. ИМХО от того должно зависеть где этот код находится и нужна ли вообще его оптимизация. Я против лишних соединений, т.к. они ухудшают читаемость запросов.

    Ответы: (17) (18)
  18. (16) против лишних явных соединений? или против лишних неявных соединений?

    Ответы: (18)
  19. sda553 (16) против лишних явных соединений? или против лишних неявных соединений?

    вобщем не знаю что под этими явными и неявными соедиенниями ты имеешь ввиду. [smile=:D]

    Ответы: (20)
  20. (18) в (0) в первом примере неявное соединение, во втором примере явное

  21. 1) Планы скорее всего будут идентичны.
    2) Выбор между 1 и 2 - вкусовщина. Лично мне нравится, при прочих равных, более короткий код.
    3) Преждевременная оптимизация - зло. Любителей пооптимизировать запросы заранее надо гонять ссаными тряпками.

    Ответы: (32)
  22. (13) ?

  23. Долго думал, но так и не допер, нафига РеализацияТоваровУслугТовары.Ссылка.Склад, если можно просто РеализацияТоваровУслугТовары.Склад? Соединения тут вообще никакого не будет, таблица явно указана. И еще непонятно, что делает склад в табличной части Товары?

    Ответы: (24)
  24. 03.06.2015 04:12:28 отредактировано Дядя Вася

    (23) А... миль пардон, все-таки в шапке, и это такой своеобразный выход на нее... Как-то через задницу вообще. Обычно к шапке ТЧ джойнят, а не наоборот...

  25. Как-то так я щетаю...

    ВЫБРАТЬ
        РеализацияТоваровУслугТовары.Номенклатура,
        РеализацияТоваровУслугТовары.Количество
    ИЗ
        Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
            ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслугТовары КАК РеализацияТоваровУслугТовары
            ПО РеализацияТоваровУслугТовары.Ссылка = РеализацияТоваровУслуг.Ссылка
                И РеализацияТоваровУслуг.Склад = &пСклад

    В принципе те же яйца, только в профиль, она и сама такой план запроса сделает, ну просто явно указать, что сначала идем по шапке, а уж потом к ней джойним ТЧ, если склад совпал, а не наоборот.

  26. за какие грехи мироздание насылает "оптимизатора запросов 1с" на одинэсника?

    Ответы: (27)
  27. (26) не, ну она права так-то. Хрен его знает как эска через две точки план запроса сделает. Но в сабже оба варианта неправильные...

    Ответы: (28) (30)
  28. (27)+ По факту она скорее всего оба раза пойдет сначала по маленькой таблице, потом по большой, но написано оба раза наоборот.

    Ответы: (31)
  29. Я ж почему сначала тормознул что типа склад в табличной части - сам-то с прямых начинал на семерке, там через две точки вообще нельзя, ошибку выдаст, ну и джойнят всегда в правильном порядке, к шапке табличную часть, а не наоборот. А в восьмерке чет расслабились, через две точки можно, вот и не думают что пишут...

  30. Дядя Вася Но в сабже оба варианта неправильные...

    сфигале?

    Ответы: (33)
  31. (28) [smile=:D]
    Нет

  32. (21)О! +1

  33. 03.06.2015 07:23:53 отредактировано Дядя Вася

    (30) По смыслу. От большой таблицы к малой идут. Движок исправит, но программист не прав так-то...

    Ответы: (34) (35)
  34. (33)+ Что первый раз от табличной части идет, что джойнит от нее же. Конечно неправильно, эта таблица в 100 раз больше.

  35. (33) ты ничё не путаешь? тут иннер джойн, вообще-то

    Ответы: (36)
  36. кстати, емнип, 1ска делает разыменование в запросе ака неявное соединение через лефт джойн

    Ответы: (38)
  37. (35) И что? Иннер сам по себе случится? Всяко по двум таблицам бегать будет чтобы собрать, и лучше если сначала по маленькой, а не наоборот, шустрее выйдет.

    Ответы: (39)
  38. (36) да об этом оговорился - двигло исправит этот косяк, но программист логически не прав.

    Ответы: (47)
  39. (37) хватит пороть чушь. никакой разницы не будет

    Ответы: (40)
  40. (39) абстракциями мыслишь. Скуль же не ими работает, а по одной записи выбирает, да сравнивает. Банальный перебор по индексу, и либо он сначала по ТЧ пойдет, либо по шапке. Последнее понятно быстрее. И он пойдет скорее по шапке, несмотря на косяк в запросе. Но запрос составлен через жопу я щетаю...

    Ответы: (43)
  41. 03.06.2015 07:39:48 отредактировано Дядя Вася

    В запросе написано, а давайте переберем таблицу, где ТЧ, да выберем из нее только те записи которые соответствуют нужному складу. Скуль план запроса наоборот составит, переберет сначала таблицу с шапкой где тот склад, а с нее уж на ТЧ выходить будет. В запросе логическая ошибка, от большего к меньшему сделан.

    Ответы: (43) (44)
  42. Даже попроще скажу, на пальцах так скать: логично сначала найти нужный документ, а потом заглянуть в его проводке. В запросах в сабже написано ровно наоборот - переберем все движения, да из них выйдем на документ. Это ежу понятно дольше.

    Ответы: (43)
  43. (40)(41)(42) нет

  44. (41) ты точно понимаешь, как работает иннер джойн?

    Ответы: (45) (46)
  45. (44) Ты мне сейчас его логику объяснить что ли хочешь? Да, понимаю, выбираются записи, ключ которых есть и там и там. Но они не по волшебству там появляются, обычные циклы же по таблицам.

  46. (44)
    Ну вообще то разницы все таки есть, что к чему присоединять.
    Если в таблицах N1 и N2 записей и , допустим, на кадждую запись из первой таблицы мы по индексу ищем записи во второй, то получается, что сложность поиска соответствующих записей во второй таблице на одну запись первой O(Ln(N2))
    Тогда общая сложность получается O(N1*ln(N2))
    Отсюда видно, что если N1>>N2, то выгоднее, чтобы было O(N2*ln(N1)), т.е. перебирать вторую и к ней джойнить первую.

    Но от того в каком порядке ты это запишешь в тексте запроса, все равно ничего не зависит. Планировщик запроса сам оценит количества записей в таблицах, статистику обработки, фильтры и джойны, которые идут далее по запросу учтет индексы и поставит таблицы в нужном порядке, который он считает наиболее оптимальным для выполнения всего запроса.

    Ответы: (49) (72)
  47. (38) программист логически прав и в Select 1, 2, 3 и в Select * From Catalog.Банки, просто у программистов разная логика бывает )

  48. Короче потестил на живых данных, оба варианта по времени выполняются с точностью до миллисекунды

    Ответы: (55)
  49. (46) т.е. ты хочешь меня убедить, что искать N записей в таблице размером 10N выгоднее, чем искать 10N записей в таблице размером N?

    Ответы: (50)
  50. (49) ага. Суди сам.
    Упрощенно:
    1. Ищем N записей в таблице 10*N с индексом

    Перебираем записи цикл от 1 до N
    {
    Выполняем поиск в 10N по индексу - примерно Ln(10N) операций сравнения
    }

    Итого N*ln(10*N) операций = N*(ln(10)+ln(N))=N*ln(10)+N*Ln(N)

    2. 1. Ищем 10*N записей в таблице N с индексом
    Перебираем записи цикл от 1 до 10*N
    {
    Выполняем поиск в N по индексу - примерно Ln(N) операций сравнения
    }

    Итого 10*N*ln(N) операций = 9*N*ln(N)+N*ln(N)

    ===========
    Теперь сравним N*ln(10)+N*Ln(N) и 9*N*ln(N)+N*ln(N)
    Очевидно, что N*ln(10) < 9*N*ln(N) уже даже для N=2, не говоря уж о больших N

    Ответы: (51) (52)
  51. (50) При живой статистике оптимизатор скуля всегда раскручивает джойны в правильном направлении.

  52. (50) формально соглашусь, но здесь есть нюанс

    sda553 примерно Ln(10N) операций сравнения

    O(ln(10N)), а не примерно ln(10N)
    O(ln(10N)) - это и ln(10N), и 5 ln(10N), и 10 ln(10N)

    Ответы: (54)
  53. так что на практике не всё так красиво, как в теории

  54. 03.06.2015 11:00:31 отредактировано sda553

    (52) я сразу вроде и сказал, что О(N1*ln(N2))
    Ну или более жизненные пример, понятный
    У тебя есть бумажка с 10 фамилиями "Иванов, Петров, Сидоров...."
    И есть телефонный справочник города Москвы, где все фамилии по алфавиту.(проиндексирован типа)

    Тебе надо пользуясь этими двумя источниками составить записку [Фамилия] - [Номер телефона], для Иванова Петрова Сидорова....

    У тебя есть два алгоритма на это
    1. Перебирать все записи телефонного справочника г. Москвы от А до Я и взяв каждую запись оттуда сверять, не содержиться ли эта фамилия из справочника в бумажке с 10 фамилиями
    2. Перебрать 10 фамилий из бумажки и для каждой фамилии находить соответствующую запись в телефонном справочнике г.москвы

    Согласись 2-ой вариант оптимальнее будет

    Ответы: (56) (67)
  55. (48) добавь для корректности 3 условия для достоверности, по одному разговаривать то не о чем. Запрос был чисто для примера.
    период между
    реквизит составного
    реквизит обычный

    Ответы: (57) (59) (63)
  56. (55) а как количество условий влияет на производительность?

    Ответы: (58)
  57. (57) вот мы и выясним повлияет или нет ...

    Ответы: (59)
  58. 03.06.2015 11:11:42 отредактировано sf

    (58) объясни смысл эксперимента?

    Fynjy период между
    реквизит составного
    реквизит обычный

    у Мика своя конфа, у тебя своя....
    реквизиты могут быть проиндексированы и не очень
    можно задействовать кластерный индекс, а можно и пропустить.

    Ответы: (60)
  59. (59) Я это все понимаю, но вот инетерсно ...

  60. (2) и правильно делает :)

  61. (0) В данном случае будет работать одинаково.
    Но, лучше избегать "двоеточий", например, конструкций вида Регистратор.Дата при обращении к регистрам, т.к. типов регистраторов может оказаться много и это приведет к каскадному увеличению соединений.

    Ответы: (64)
  62. (55) какая разница, джойн в любом случае будет идти по ссылке

    Ответы: (64)
  63. (62) можно привести к типам и ограничить соединения нужными.
    (63) не факт, вопрос в том, как транслирует запрос 1С в каком виде. Не удивлюсь, что через жопу ...

    Ответы: (65)
  64. Fynjy Не удивлюсь, что через жопу ...

    так проверь. будь мужиком, посмотри план запроса!

  65. ГОСПОДА оптимизаторы. Приведите мне пример оптимального запроса, который позволил бы выявить контрагентов с одинаковым ИНН.

    Ответы: (68) (69)
  66. (54) хорошо, будем считать, что убедил.
    но если взять пример "Справочник со 100 абонентами и список с 10 фамилиями", то уже не всё так радужно

    Ответы: (72)
  67. (66) having

    Ответы: (71)
  68. (66)
    select distinct contr1.ref
    from
    contr1 inner join contr2 on contr1.ref<>contr2.ref and contr1.inn=contr2.inn

    Ответы: (79) (104)
  69. 03.06.2015 14:31:03 отредактировано MIK

    Кстати, вижу прямо только что в типовом УТП

    					И Номенклатура В
    						(ВЫБРАТЬ РАЗЛИЧНЫЕ
    							Документ.РасходныйОрдерНаТовары.Товары.Номенклатура
    						ИЗ
    							Документ.РасходныйОрдерНаТовары.Товары
    						ГДЕ
    							Документ.РасходныйОрдерНаТовары.Товары.Ссылка = &ДокументСсылка)
    

    Так что девочка идет лесом )

    Ответы: (74) (76)
  70. (68) давай пример, там делов то на 1 мин

    Ответы: (78)
  71. (67) а я это сразу сказал

    sda553 Планировщик запроса сам оценит количества записей в таблицах, статистику обработки, фильтры и джойны, которые идут далее по запросу учтет индексы и поставит таблицы в нужном порядке, который он считает наиболее оптимальным для выполнения всего запроса.

    Ответы: (73)
  72. (72) убедил

  73. MIK вижу прямо только что в типовом УТП

    дык типовые ж кривые, не знал?

    Ответы: (75)
  74. (74) я так не думаю

    Ответы: (76)
  75. (75) ну... запрос в (70) как-то еще можно переписать?

    Ответы: (77)
  76. (76) это откровенная жопа, а не запрос ...

    Ответы: (80)
  77. (71)

    select
     Контрагенты.Ссылка
     ,count(distinct Контрагенты.ИНН) as ИНН
    from
          Справочник.Контрагенты as Контрагенты
    group by
          Контрагенты.Ссылка
    having
          count(distinct Контрагенты.ИНН)>1
    Ответы: (79) (81) (97)
  78. (78) чем лучше (69)

  79. 03.06.2015 14:42:10 отредактировано sf

    (77)да ладно [smile=^_^]
    давай продолжим после того, как ты нам покажешь как 1С транслировала запросы из (0)?

    Ответы: (129)
  80. (78) Не проканает

    Ответы: (82)
  81. (81) да ладно? а я ведь проверю

    Ответы: (84) (85)
  82. Честно сказать, в лом смотреть, но могу предположить, что первый запрос транслируется во второй при исполнении:) Что есть " РеализацияТоваровУслугТовары.Ссылка.Склад" - неявное соединение:):)

  83. (82) проверь

    Ответы: (86)
  84. (82) нужно количество различные

    Ответы: (91)
  85. 03.06.2015 14:46:40 отредактировано sda553

    (84) У тебя получилось наоборот по смыслу, выявить контрагентов у которых одному конртагенту соответствует более одного ИНН. А я так понял надо выявить разных контрагентов с одним одинаковым ИНН

    Ответы: (89)
  86. Запрос - 0.28сек:

    ВЫБРАТЬ
    	КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Контрагенты.Ссылка) КАК Ссылка,
    	Контрагенты.ИНН
    ПОМЕСТИТЬ ТаблицаИНН
    ИЗ
    	Справочник.Контрагенты КАК Контрагенты
    
    СГРУППИРОВАТЬ ПО
    	Контрагенты.ИНН
    
    ИМЕЮЩИЕ
    	КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Контрагенты.Ссылка) > 1
    ;
    
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
    	Контрагенты.Ссылка,
    	Контрагенты.ИНН
    ИЗ
    	Справочник.Контрагенты КАК Контрагенты
    ГДЕ
    	Контрагенты.ИНН В
    			(ВЫБРАТЬ
    				ТаблицаИНН.ИНН
    			ИЗ
    				ТаблицаИНН КАК ТаблицаИНН)

    Запрос - 3.34 сек:

    ВЫБРАТЬ
    	Контрагенты.Ссылка,
    	Контрагенты.ИНН КАК ИНН,
    	Контрагенты1.Ссылка КАК Ссылка1,
    	Контрагенты1.ИНН КАК ИНН1
    ИЗ
    	Справочник.Контрагенты КАК Контрагенты
    		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты1
    		ПО (НЕ Контрагенты.Ссылка = Контрагенты1.Ссылка)
    			И Контрагенты.ИНН = Контрагенты1.ИНН
    Ответы: (88) (89) (98) (104) (120)
  87. (87) да, только первый вариант, ну можно еще вложенный запрос и внутреннее соединение

  88. (87) это разные по смыслу запросы, смотри (86)

    Ответы: (93)
  89. на собеседовании задали этот вопрос. я написал запрос №1. мой запрос унесли на проверку "местному прогу". когда "пришел ответ от прога" - мне его не сказали, но сказали, что на этом собеседование закончено, со мной свяжутся.

    уверен, тот мега прог был авторов запроса №2. но ни разу не тестировал производительность.

    Ответы: (119)
  90. (85) а я чё написал?

    Ответы: (92)
  91. (91) ааа, пропустил. да, запрос верный. но для вывода самих контрагентов нужен еще запрос.

    Ответы: (97)
  92. (89) посмотри запросы внимательнее

    Ответы: (94)
  93. (93) а ну да,... теперь одинаковые по смыслу

    Ответы: (95)
  94. (94) первый запрос быстрее на порядок

    Ответы: (99) (100)
  95. хотя не такой "красивый"

  96. (92) в (78) запрос не верный

    Ответы: (101) (106)
  97. (87) Первый запрос не быстрее будет соединением во второй части? Или их там 10 штук?

    Ответы: (102)
  98. (95) кто сказал что на порядок, я например вообще не дождался его окончания ) там полное декартово соединение

    Ответы: (105)
  99. Новее ›

или зарегистрируйтесь чтобы ответить!