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

  1. 9 г. назад

    Первый

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

    Второй

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Ответы: (50)
  14. (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)
  15. (50) При живой статистике оптимизатор скуля всегда раскручивает джойны в правильном направлении.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Ответы: (105)
  63. (95) нифига. все зависит от количества записей. если контрагентов меньше 50, то запрос sda - быстрее

    Ответы: (103)
  64. (97) верный, но не полный

  65. (98) не тестировал. может быть

  66. (100) ну в конторах, которые обслуживает сда - конечно, у ИПшников по 5-10 контрагентов всего.

    Ответы: (108) (119)
  67. первый запрос в (87)
    select с группировкой O(N)

    второй запрос в (87)
    O(N^2)

    так что да,
    твой вариант оптимальнее, чем (69)

  68. (99) я проверил. контрагентов более 3000.

  69. (97) сфигали?

    Ответы: (107) (110)
  70. 03.06.2015 14:56:29 отредактировано sf

    (106) группировка по ссылке - у ссылки всегда один ИНН, не?
    p.s. но идея верна

    Ответы: (109)
  71. (103) а дело не в этом. дело в оптимизаторе. короче тут нет правильного варианта.

  72. (107) ах, ну, да. я просто писал напрямую в форум.
    группировать по ИНН надо, конечно

    Ответы: (113)
  73. (106) у одного контрагента не могут быть несколько ИНН

    короче ИМХО правильный вариант такой

    ВЫБРАТЬ
    	Контрагенты.Ссылка,
    	Контрагенты.ИНН
    ИЗ
    	Справочник.Контрагенты КАК Контрагенты
    		ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
    			Контрагенты.ИНН КАК ИНН
    		ИЗ
    			Справочник.Контрагенты КАК Контрагенты
    		ГДЕ
    			Контрагенты.ИНН <> ""
    		
    		СГРУППИРОВАТЬ ПО
    			Контрагенты.ИНН
    		
    		ИМЕЮЩИЕ
    			КОЛИЧЕСТВО(Контрагенты.ИНН) > 1) КАК ВложенныйЗапрос
    		ПО Контрагенты.ИНН = ВложенныйЗапрос.ИНН
    
    Ответы: (112) (113) (114)
  74. а..не, не все так радужно
    ВЫБРАТЬ
    Контрагенты.Ссылка,
    Контрагенты.ИНН
    ИЗ
    Справочник.Контрагенты КАК Контрагенты
    ГДЕ
    Контрагенты.ИНН В
    (ВЫБРАТЬ
    ТаблицаИНН.ИНН
    ИЗ
    ТаблицаИНН КАК ТаблицаИНН)

    Этот запрос имеет сложность N^2 если ТаблицаИНН сравнима с таблицей контрагенты и отсутствии индекса по ИНН.

    Так что запрос резко подведет в производительности если двойников по ИНН много очень

  75. (110) ты еще вложенность добавил. смертный грех для эксперта.

    Ответы: (114) (115)
  76. MIK у одного контрагента не могут быть несколько ИНН

    да всё, я же уже написал (109)

  77. MIK Контрагенты.ИНН <> ""

    это что? финт, чтобы отключить индекс, который там может быть? )

    Бешеная Нога смертный грех для эксперта.

    вложенность в данном случае будет стопудово быстрее создания временной таблицы

  78. Бешеная Нога смертный грех для эксперта

    ахаха, чушь )

    Ответы: (116) (122)
  79. (115) типовые долго от вложенных избавлялись, особенно в части зупа

    Ответы: (118)
  80. Если можно написать оптимальный запрос без использования временных таблиц, то лучше обойтись без них.
    Запрос с оптимальным кодом без временных таблиц в любом случае будет работать быстрее и использовать меньше ресурсов, чем запрос с временными таблицами.

    (с)

    Ответы: (121) (126) (128)
  81. (116) вангую повторное использование временных таблимц

  82. (103) да лажанул я наспех, признаю. Но конторы которые проводят собеседование как в (90) мне все равно не нравятся, правильнее было бы дать возможность оценить сложность алгоритма исполнения получившегося запроса, после чего предложить эту сложность "упростить" при таких то сяких то допущениях

  83. (87) потесть на своих данных, есть ли какая-нибудь разница

    select
     Контрагенты.ИНН
     ,count(distinct Контрагенты.Ссылка) as ИНН
    from
          Справочник.Контрагенты as Контрагенты
    group by
          Контрагенты.ИНН
    having
          count(distinct Контрагенты.Ссылка)>1
    
    select
     Контрагенты.ИНН
     ,count(Контрагенты.ИНН) as ИНН
    from
          Справочник.Контрагенты as Контрагенты
    group by
          Контрагенты.ИНН
    having
          count(Контрагенты.ИНН)>1
    
    Ответы: (123)
  84. (117) :) Такие безапелляционные утверждения... Не работали люди с большими базами, с денормализованными базами. Индексы на временные таблицы не создавали...

    Ответы: (128)
  85. (115) и в чём состоит чушь?

  86. 03.06.2015 15:10:23 отредактировано sda553

    (120) оба O(N) просто перебрать все строки таблицы алгоритму

    Ответы: (124)
  87. (123) чисто для интереса

    Ответы: (125)
  88. 03.06.2015 15:16:18 отредактировано sda553

    (124) второй запрос с очепяткой - или так и задумано?
    select
    Контрагенты.ИНН
    ,count(Контрагенты.ИНН) as ИНН

  89. (117) без временных, но с вложенными. пиши с вложенными. только контору свою назови, чтобы знать куда ходить не надо.

    Ответы: (127)
  90. (126) давай забьем что в этом случае с задвоенными ИНН ВТ не будет быстрее вложенного?

    я тоже повсеместно использую ВТ, но это не значит что это панацея

  91. Sorm Такие безапелляционные утверждения

    вовсе нет:

    MIK Если можно написать оптимальный запрос

    в рамках задачи нуфа - без временных будет быстрее, к гадалке не ходи

  92. (80) завтра с вечером на 2 терабайтной базе поиграюсь с профайлером ))

    Ответы: (130)
  93. 03.06.2015 15:17:52 отредактировано sf

    (129) нафига профайлер? начни с ТЖ

  94. Как я и говорил

    0.374 с

    ВЫБРАТЬ
    Контрагенты.Ссылка,
    Контрагенты.ИНН
    ИЗ
    Справочник.Контрагенты КАК Контрагенты
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
    Контрагенты.ИНН КАК ИНН
    ИЗ
    Справочник.Контрагенты КАК Контрагенты

    СГРУППИРОВАТЬ ПО
    Контрагенты.ИНН

    ИМЕЮЩИЕ
    КОЛИЧЕСТВО(Контрагенты.ИНН) > 1) КАК ВложенныйЗапрос
    ПО Контрагенты.ИНН = ВложенныйЗапрос.ИНН

    0.546 с

    ВЫБРАТЬ
    Контрагенты.ИНН КАК ИНН
    ПОМЕСТИТЬ ВТ
    ИЗ
    Справочник.Контрагенты КАК Контрагенты

    СГРУППИРОВАТЬ ПО
    Контрагенты.ИНН

    ИМЕЮЩИЕ
    КОЛИЧЕСТВО(Контрагенты.ИНН) > 1
    ;

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

    Ответы: (132) (133) (137)
  95. (131) у тебя база кривая

    Ответы: (135)
  96. (131) а все почему? у нас сервера бодрее

  97. с 3мя контрагентами

    Ответы: (136)
  98. (132) харе троллить

  99. (134) 57 056

  100. (131) Да, первый запрос наиболее оптимальный, имхо.

  101. Почему все привязались к уникальности ИНН? Обособки уже отменили?

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