[РЕШЕНО] Сравнить 2 набора данных

Тема в разделе "Система компоновки данных (СКД)", создана пользователем lezhek, 27 авг 2015.

  1. Draco
    Offline

    Draco Модераторы Команда форума Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.649
    Симпатии:
    948
    Баллы:
    204
    ну да, я опечатался
  2. Yuriy_Alexandrovich
    Offline

    Yuriy_Alexandrovich Профессионал в 1С Команда форума

    Регистрация:
    15 сен 2011
    Сообщения:
    1.275
    Симпатии:
    76
    Баллы:
    54
    Не нахожу подтверждения, что объединение будет работать быстрее :) (чес. слово сам удивлен, хотя, нет не удивлен, сомневался), добавил еще процедурку с оборотами и вот результат :
    upload_2015-8-28_13-53-42.png
    Получается что первая процедура, в запросной части которой использовалось полное соединение отрабатывает быстрее ;), а с оборотами мене производительна по сравнению с остальными.

    Понятно, что все это офтоп. но мне было интересно почему в подавляющем случае говорят, что полное соединение хуже гы...

    Да, поскольку автор не говорил в какой конфе он старается сравнить два регистра, и с какой целью, и иже, молчит о SQL, я тест провел на УПП с SQL сервером на "PostGreeееее"
    --- Объединение сообщений, 28 авг 2015 ---
    выборка в оборотах с использованием периодичности по регистратору, в принципе тоже самое + вычисление оборотов на каждое движение. т.е. еще хуже
    Это мое IMHO
    Последнее редактирование: 28 авг 2015
  3. Draco
    Offline

    Draco Модераторы Команда форума Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.649
    Симпатии:
    948
    Баллы:
    204
    НУ опять же смотрите, в первой части (ваше польное соединение) вы берете просто таблицу во второй части (объеденение) вы берете виртуальные таблицы оборотово
    При объеденеи так же как и при соединнии не рекомендуется объеденятьи соеденять виртуальные таблицы, т.к система н езнает сколько записей и не всегда выберет адекватный план запроса.
    еще один момент. таблица оборотов ее в базе то нет. и она на самом деле стоится из таблицы остатков и движений, мы не знаем на какую у вас дату актуально расчитаны остатки. по этому есть вариант что это будет таблица остатков и большая таблица оборотов, которые будут соеденятся левым соединением и потом объеденяться, что может вызвать вообще не благоприятный план запроса.

    Так же у вас когда по со соединению выполнили уже 3 раза запрос, статистика есть и план запроса будет оптимальный.

    для таки тестов более наглядно было бы если первый набор данных и второй помещаются во временную таблицу что бы они были в памяти и на запрос это никак не влияло.
    А затем эти оба надора либо объеденить либо соеденить.

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

    Yuriy_Alexandrovich Профессионал в 1С Команда форума

    Регистрация:
    15 сен 2011
    Сообщения:
    1.275
    Симпатии:
    76
    Баллы:
    54
    проверил на ms sql результаты те же ;)
  5. Draco
    Offline

    Draco Модераторы Команда форума Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.649
    Симпатии:
    948
    Баллы:
    204
    я говорю если уж проверять что быстрее работает это надо как я вам сказал что бы оба набора были в ВТ, количество записей было приблизительно сопастовимо и тогда уже вперед
  6. Yuriy_Alexandrovich
    Offline

    Yuriy_Alexandrovich Профессионал в 1С Команда форума

    Регистрация:
    15 сен 2011
    Сообщения:
    1.275
    Симпатии:
    76
    Баллы:
    54
    Проверил с временными таблицами, в рамках этой задачи существенной разницы между объединением и соединением не вижу.
    Думаю при выполнении план запроса примерно одинаков.
    Обработина во вложении.

    Вложения:

  7. Draco
    Offline

    Draco Модераторы Команда форума Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.649
    Симпатии:
    948
    Баллы:
    204
    Молодец. Видно объемы данных не существенны. когда большие тогда уже видно.
  8. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.581
    Симпатии:
    717
    Баллы:
    204
    Че-т у меня ваще какая-то хрень:

    Вот код обработки:
    Код:
    Процедура КнопкаВыполнитьНажатие(Кнопка)
       
        Запрос = Новый Запрос;
        Запрос.УстановитьПараметр("ДатаПериода", '20120101');
       
        Текст1 =
        "ВЫБРАТЬ
        |    ПартииТоваровНаСкладахБухгалтерскийУчет.Регистратор,
        |    ПартииТоваровНаСкладахБухгалтерскийУчет.Номенклатура,
        |    ПартииТоваровНаСкладахБухгалтерскийУчет.Склад,
        |    ПартииТоваровНаСкладахБухгалтерскийУчет.Количество,
        |    ТоварыНаСкладах.Регистратор КАК Регистратор1,
        |    ТоварыНаСкладах.Номенклатура КАК Номенклатура1,
        |    ТоварыНаСкладах.Склад КАК Склад1,
        |    ТоварыНаСкладах.Количество КАК Количество1
        |ИЗ
        |    РегистрНакопления.ПартииТоваровНаСкладахБухгалтерскийУчет КАК ПартииТоваровНаСкладахБухгалтерскийУчет
        |        ПОЛНОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах КАК ТоварыНаСкладах
        |        ПО ПартииТоваровНаСкладахБухгалтерскийУчет.Регистратор = ТоварыНаСкладах.Регистратор
        |            И ПартииТоваровНаСкладахБухгалтерскийУчет.Номенклатура = ТоварыНаСкладах.Номенклатура
        |            И ПартииТоваровНаСкладахБухгалтерскийУчет.Склад = ТоварыНаСкладах.Склад
        |ГДЕ
        |    ПартииТоваровНаСкладахБухгалтерскийУчет.Период МЕЖДУ НАЧАЛОПЕРИОДА(&ДатаПериода, ГОД) И КОНЕЦПЕРИОДА(&ДатаПериода, ГОД)
        |    И ТоварыНаСкладах.Период МЕЖДУ НАЧАЛОПЕРИОДА(&ДатаПериода, ГОД) И КОНЕЦПЕРИОДА(&ДатаПериода, ГОД)
        |    И НЕ (ЕСТЬNULL(ТоварыНаСкладах.Количество, 0) = ЕСТЬNULL(ПартииТоваровНаСкладахБухгалтерскийУчет.Количество, 0))
        //|    И (ПартииТоваровНаСкладахБухгалтерскийУчет.Регистратор ЕСТЬ NULL
        //|            ИЛИ ТоварыНаСкладах.Регистратор ЕСТЬ NULL )
        |";
       
        Текст2 =
        "ВЫБРАТЬ
        |    ВложенныйЗапрос.Склад,
        |    ВложенныйЗапрос.Номенклатура,
        |    СУММА(ВложенныйЗапрос.КоличествоОборот) КАК КоличествоОборот,
        |    ВложенныйЗапрос.Регистратор
        |ИЗ
        |    (ВЫБРАТЬ
        |        ТоварыНаСкладахОбороты.Склад КАК Склад,
        |        ТоварыНаСкладахОбороты.Номенклатура КАК Номенклатура,
        |        ТоварыНаСкладахОбороты.КоличествоОборот КАК КоличествоОборот,
        |        ТоварыНаСкладахОбороты.Регистратор КАК Регистратор
        |    ИЗ
        |        РегистрНакопления.ТоварыНаСкладах.Обороты(НАЧАЛОПЕРИОДА(&ДатаПериода, ГОД), КОНЕЦПЕРИОДА(&ДатаПериода, ГОД), Регистратор, ) КАК ТоварыНаСкладахОбороты
        |   
        |    ОБЪЕДИНИТЬ ВСЕ
        |   
        |    ВЫБРАТЬ
        |        ПартииТоваровНаСкладахОбороты.Склад,
        |        ПартииТоваровНаСкладахОбороты.Номенклатура,
        |        -ПартииТоваровНаСкладахОбороты.КоличествоОборот,
        |        ПартииТоваровНаСкладахОбороты.Регистратор
        |    ИЗ
        |        РегистрНакопления.ПартииТоваровНаСкладах.Обороты(НАЧАЛОПЕРИОДА(&ДатаПериода, ГОД), КОНЕЦПЕРИОДА(&ДатаПериода, ГОД), Регистратор, ) КАК ПартииТоваровНаСкладахОбороты) КАК ВложенныйЗапрос
        |
        |СГРУППИРОВАТЬ ПО
        |    ВложенныйЗапрос.Склад,
        |    ВложенныйЗапрос.Регистратор,
        |    ВложенныйЗапрос.Номенклатура
        |
        |ИМЕЮЩИЕ
        |    СУММА(ВложенныйЗапрос.КоличествоОборот) <> 0";
       
        Для СЧ = 1 ПО 5 Цикл
           
            Сообщить("==========");
           
            Запрос.Текст = Текст1;
            ВЫборка = Запрос.Выполнить().Выбрать();
            Сообщить("Количество записей: " + Формат(ВЫборка.Количество()));
           
           
            Запрос.Текст = Текст2;       
            Запрос.Выполнить();
           
            ВЫборка = Запрос.Выполнить().Выбрать();
            Сообщить("Количество записей: " + Формат(ВЫборка.Количество()));
           
            Сообщить("==========");
           
        КонецЦикла;
       
       
    КонецПроцедуры
    Вот результат:
    Вот замер производительности:
    upload_2015-8-28_15-33-25.png

    Я прихожу к выводу, что полное соединение показывает далеко не все данные.
  9. Draco
    Offline

    Draco Модераторы Команда форума Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.649
    Симпатии:
    948
    Баллы:
    204
    я же написал что его запрос на полное соединени и отбором по регисратору NULL он не верный и не учитвает данные когда по одному регистру списалось одно количество по другому другое.
    У него это будет работать толко на тех что по одному было движенеи по другому вообще не было. соотвевтвенно у енго по сравнению с нашим запросмо количество записей гораздо меньше
  10. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.581
    Симпатии:
    717
    Баллы:
    204
    Ага, точно, там же соединение по регистратору идет.....
    В общем - фигня получается, отсюда и разница во времени выполнения в несколько раз....
  11. Yuriy_Alexandrovich
    Offline

    Yuriy_Alexandrovich Профессионал в 1С Команда форума

    Регистрация:
    15 сен 2011
    Сообщения:
    1.275
    Симпатии:
    76
    Баллы:
    54
    Разница обусловлена разным количеством регистраторов у регистров, например у "Партий Товаров на складах" есть регистратор Возврат/Поступление в НТТ, чего у "Товаров на складах" по понятным причинам просто нет
    --- Объединение сообщений, 28 авг 2015 ---
    и скажем "Чек ККМ" есть в "Товарах на складах", а в "Партиях .." нет
  12. Draco
    Offline

    Draco Модераторы Команда форума Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.649
    Симпатии:
    948
    Баллы:
    204
    да тут не в том дело. В обоих то запросах оба регисра учавствуют и при соединении и при объединени и регстратор что там что там.
    Я говорю про условие вашего соединения что в итоге получаем. ваш вариант не совсем корректный. как написал вариант когда одним документам по одной номенклатуре по регистрам спишется ваше количсество не попадет такая строка в аш запрос. т.к там сравнения по количеству нет
  13. Yuriy_Alexandrovich
    Offline

    Yuriy_Alexandrovich Профессионал в 1С Команда форума

    Регистрация:
    15 сен 2011
    Сообщения:
    1.275
    Симпатии:
    76
    Баллы:
    54
    Одно уточнение, вариант не мой, а ТС, см. сообщение №10 ;)
  14. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.581
    Симпатии:
    717
    Баллы:
    204
    Если разрешено движение в минус, то регистратор у ТоварыНаСкладах будет, а у ПартииТоваровНаСкладахБУ - нет, т.к. партия списывается исключительно до 0.
    --- Объединение сообщений, 28 авг 2015 ---
    Ну так не нужно уподоблятся ТС, нужно ж подсказать правильное решение......
  15. Yuriy_Alexandrovich
    Offline

    Yuriy_Alexandrovich Профессионал в 1С Команда форума

    Регистрация:
    15 сен 2011
    Сообщения:
    1.275
    Симпатии:
    76
    Баллы:
    54
    1. Не знаете с какой конфой ТС работает
    2. Не знаете описания набора данных, которые ТС пытается сравнить
    В этом случае "подсказанное правильное решение" может оказаться не совсем верным o_O
  16. Draco
    Offline

    Draco Модераторы Команда форума Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.649
    Симпатии:
    948
    Баллы:
    204
    1 я про это говорил в 6 посту
    2. по этому я в 9 посту и написал алгоритм, который понимая можно релаизовать на своей конфе спокойно
  17. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.581
    Симпатии:
    717
    Баллы:
    204
    Да в любом случае, для решения задачи нахождения различий в двух таблицах одинаковой структуры, необходимо использовать объединение этих таблиц, а не соединение, т.к. данные могут просто отсутствовать в одной из таблиц.
  18. Yuriy_Alexandrovich
    Offline

    Yuriy_Alexandrovich Профессионал в 1С Команда форума

    Регистрация:
    15 сен 2011
    Сообщения:
    1.275
    Симпатии:
    76
    Баллы:
    54
    Не, нифига. без дополнительных переделок запрос(с объединением) не даст информации о том какой из сравниваемых наборов содержит те или иные отличительные записи
  19. Yuriy_Alexandrovich
    Offline

    Yuriy_Alexandrovich Профессионал в 1С Команда форума

    Регистрация:
    15 сен 2011
    Сообщения:
    1.275
    Симпатии:
    76
    Баллы:
    54
    Нет, и вот почему - таблицы соединятся по Регистратор, Склад, Номенклатура, поскольку соединения по количеству нет то в результат соединения войдут сочетания по количеству, которые отсеются только в конструкции "ГДЕ" и то не все, поскольку используется конструкция "ЕстьNULL"
    Код:
    ВЫБРАТЬ
      ПартииТоваровНаСкладахБухгалтерскийУчет.Регистратор,
    ПартииТоваровНаСкладахБухгалтерскийУчет.Номенклатура,
      ПартииТоваровНаСкладахБухгалтерскийУчет.Склад,
      ПартииТоваровНаСкладахБухгалтерскийУчет.Количество,
      ТоварыНаСкладах.Регистратор КАК Регистратор1,
      ТоварыНаСкладах.Номенклатура КАК Номенклатура1,
      ТоварыНаСкладах.Склад КАК Склад1,
      ТоварыНаСкладах.Количество КАК Количество1
    ИЗ
      РегистрНакопления.ПартииТоваровНаСкладахБухгалтерскийУчет КАК ПартииТоваровНаСкладахБухгалтерскийУчет
      ПОЛНОЕ СОЕДИНЕНИЕ
             РегистрНакопления.ТоварыНаСкладах КАК ТоварыНаСкладах
      ПО ПартииТоваровНаСкладахБухгалтерскийУчет.Регистратор = ТоварыНаСкладах.Регистратор
      И ПартииТоваровНаСкладахБухгалтерскийУчет.Номенклатура = ТоварыНаСкладах.Номенклатура
      И ПартииТоваровНаСкладахБухгалтерскийУчет.Склад = ТоварыНаСкладах.Склад
      И ТоварыНаСкладах.Количество = ПартииТоваровНаСкладахБухгалтерскийУчет.Количество
    ГДЕ
      ПартииТоваровНаСкладахБухгалтерскийУчет.Период МЕЖДУ НАЧАЛОПЕРИОДА(&ДатаПериода, ГОД) И КОНЕЦПЕРИОДА(&ДатаПериода, ГОД)
      И ТоварыНаСкладах.Период МЕЖДУ НАЧАЛОПЕРИОДА(&ДатаПериода, ГОД) И КОНЕЦПЕРИОДА(&ДатаПериода, ГОД)
     
      И (ПартииТоваровНаСкладахБухгалтерскийУчет.Регистратор ЕСТЬ NULL
       ИЛИ ТоварыНаСкладах.Регистратор ЕСТЬ NULL )
    
  20. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.581
    Симпатии:
    717
    Баллы:
    204
    Еще раз: если в ТоварыНаСкладах будет строка, а в ПартииТоваровНаСкладахБУ этой строки не будет совсем, то в результате соединения таблиц этой строки так же не будет, т.к. соединять не с чем. Я ж показал наглядно количество строк в обоих случаях, объединение дает гораздо больше строк и это верно, в отличие от соединения.

Поделиться этой страницей