8.х Оптимизация запроса, нужны советы )

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем Vladius, 3 окт 2014.

Статус темы:
Закрыта.
  1. TopicStarter Overlay
    Vladius
    Offline

    Vladius Опытный в 1С

    Регистрация:
    10 ноя 2010
    Сообщения:
    663
    Симпатии:
    3
    Баллы:
    29
    Подскажите что в моем запросе не так, оооочень долго работает на период за месяц за квартал ещё дольше. Может из за того что пользователь выбирает очень много групп товаров?

    Код:
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
                       |    СУММА(ЕСТЬNULL(ПродажиСебестоимостьОбороты.СтоимостьОборот, 0)) КАК Себестоимость,
                       |    СУММА(ЕСТЬNULL(ПродажиОбороты.СтоимостьОборот, 0)) КАК Продажи,
                       |    СУММА(ЕСТЬNULL(ПродажиОбороты.СтоимостьОборот, 0) - ЕСТЬNULL(ПродажиСебестоимостьОбороты.СтоимостьОборот, 0)) КАК Прибыль
                       |ИЗ
                       |    РегистрНакопления.ПродажиСебестоимость.Обороты(&ДатаНачала, &ДатаКонца, , Номенклатура В ИЕРАРХИИ (&Номенклатура)) КАК ПродажиСебестоимостьОбороты,
                       |    РегистрНакопления.Продажи.Обороты(&ДатаНачала, &ДатаКонца, , Номенклатура В ИЕРАРХИИ (&Номенклатура)) КАК ПродажиОбороты";
        Запрос.УстановитьПараметр("ДатаНачала", мДатаНачала);
        Запрос.УстановитьПараметр("ДатаКонца", мДатаКонца);
        Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
    
        Результат = Запрос.Выполнить();
        Выборка = Результат.Выбрать();
    
        Пока Выборка.Следующий() Цикл
       
            Возврат ?(Выборка.Себестоимость > 0, Окр(Выборка.Прибыль / Выборка.Себестоимость, 2) * 100, 0);
    
        КонецЦикла;
  2. nbIpKuH_BaH9I
    Offline

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

    Регистрация:
    16 сен 2009
    Сообщения:
    6.984
    Симпатии:
    398
    Баллы:
    104
    Где соединения?
  3. TopicStarter Overlay
    Vladius
    Offline

    Vladius Опытный в 1С

    Регистрация:
    10 ноя 2010
    Сообщения:
    663
    Симпатии:
    3
    Баллы:
    29
    А зачем оно мне? Мне надо брать ВСЕ данные с двух таблиц. Или лучше сделать через ОБЪЕДИНИТЬ ВСЕ?
  4. alexburn
    Offline

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

    Регистрация:
    5 янв 2009
    Сообщения:
    14.771
    Симпатии:
    509
    Баллы:
    204
    Нагляднее будет через ОБЪЕДИНЕНИЕ
  5. nbIpKuH_BaH9I
    Offline

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

    Регистрация:
    16 сен 2009
    Сообщения:
    6.984
    Симпатии:
    398
    Баллы:
    104
    Уже ошибка. У Вас каждая запись из первой таблицы сопоставляется с каждой записью из второй. Вот и долго. Установите соединения по измерениям.
    --- Объединение сообщений, 3 окт 2014 ---
    В его случае не важно. В любом случае должны быть поля по которым сопоставление пойдет.
  6. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.566
    Симпатии:
    717
    Баллы:
    204
    если не указан вид соединения, то выполняется полное соединение таблиц без ограничений по значениям полей
    ну а если нужно данные из двух таблиц, то может и объединение подойдет
  7. Draco
    Offline

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

    Регистрация:
    28 окт 2009
    Сообщения:
    13.639
    Симпатии:
    948
    Баллы:
    204
    а что вот это
    Пока Выборка.Следующий() Цикл

    Возврат ?(Выборка.Себестоимость > 0, Окр(Выборка.Прибыль / Выборка.Себестоимость, 2) * 100, 0);

    КонецЦикла;

    В запросе сделать нельзя было сразу?
    И поставьте соедение и объединени
  8. TopicStarter Overlay
    Vladius
    Offline

    Vladius Опытный в 1С

    Регистрация:
    10 ноя 2010
    Сообщения:
    663
    Симпатии:
    3
    Баллы:
    29
    Можно, но разницы нет где это делать.
  9. Draco
    Offline

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

    Регистрация:
    28 окт 2009
    Сообщения:
    13.639
    Симпатии:
    948
    Баллы:
    204
    В запросе сразу сделает и быстрей сработает, чем потом получит выборку и будет ее обходить.
    Если Вы запрос выполняете всегда с одной периодичностью, (например всегда месяц) то в виртуальных таблицах укажите эту периодичность.ну или от дат начала и конца можно через условие прописать что бы подставлялась нужная периодичность
  10. TopicStarter Overlay
    Vladius
    Offline

    Vladius Опытный в 1С

    Регистрация:
    10 ноя 2010
    Сообщения:
    663
    Симпатии:
    3
    Баллы:
    29
    Все равно долго( Забыл сказать, данный запрос используется 3 раза, Месяц, квартал и год...

    Код:
    "ВЫБРАТЬ
                       |    СУММА(ЕСТЬNULL(ВложенныйЗапрос.Продажи, 0) - ЕСТЬNULL(ВложенныйЗапрос.Себестоимость, 0)) КАК Прибыль,
                       |    СУММА(ЕСТЬNULL(ВложенныйЗапрос.Продажи, 0)) КАК Продажи,
                       |    СУММА(ЕСТЬNULL(ВложенныйЗапрос.Себестоимость, 0)) КАК Себестоимость
                       |ИЗ
                       |    (ВЫБРАТЬ
                       |        ПродажиОбороты.СтоимостьОборот КАК Продажи,
                       |        0 КАК Себестоимость
                       |    ИЗ
                       |        РегистрНакопления.Продажи.Обороты(&ДатаНачала, &ДатаКонца, , Номенклатура В ИЕРАРХИИ (&Номенклатура)) КАК ПродажиОбороты
                       |  
                       |    ОБЪЕДИНИТЬ ВСЕ
                       |  
                       |    ВЫБРАТЬ
                       |        0,
                       |        ПродажиСебестоимостьОбороты.СтоимостьОборот
                       |    ИЗ
                       |        РегистрНакопления.ПродажиСебестоимость.Обороты(&ДатаНачала, &ДатаКонца, , Номенклатура В ИЕРАРХИИ (&Номенклатура)) КАК ПродажиСебестоимостьОбороты) КАК ВложенныйЗапрос"
    --- Объединение сообщений, 3 окт 2014 ---
    Засек время, на месяц так же долго около 40 секунд уходит ((( Раньше с тем запросом так же было.
    --- Объединение сообщений, 3 окт 2014 ---
    А что там той выборки? 1 строка. Основное время уходит на Запрос.Выполнить()
    Последнее редактирование: 3 окт 2014
  11. TriviumFan
    Offline

    TriviumFan Опытный в 1С Заблокирован

    Регистрация:
    19 мар 2013
    Сообщения:
    92
    Симпатии:
    15
    Баллы:
    29
    Если запрос выполняется долго, то его разбивают на подзапросы и анализируют уже их.
    Сдаётся мне, что ничего Вы здесь не сможете оптимизировать.
    В параметре "Номенклатура" много элементов содержится?
    "ДатаНачала" и "ДатаОкончания" указаны на начало месяца? Если попадание в месяц неточное, то будет привлекаться физическая таблица, в противном случае - итоги.
    Пересчет итогов фурычит?
    Последнее редактирование: 3 окт 2014
  12. TopicStarter Overlay
    Vladius
    Offline

    Vladius Опытный в 1С

    Регистрация:
    10 ноя 2010
    Сообщения:
    663
    Симпатии:
    3
    Баллы:
    29
    Да, много...Указано на начало месяц, а когда начало квартала вообще жесть.

    Пересчет итогов не фурычит...
  13. TriviumFan
    Offline

    TriviumFan Опытный в 1С Заблокирован

    Регистрация:
    19 мар 2013
    Сообщения:
    92
    Симпатии:
    15
    Баллы:
    29
    Реально отключен?) Зачем?
    Если нет итогов, то конечно запрос будет так работать)
  14. TopicStarter Overlay
    Vladius
    Offline

    Vladius Опытный в 1С

    Регистрация:
    10 ноя 2010
    Сообщения:
    663
    Симпатии:
    3
    Баллы:
    29
    Туплю. Есть у нас пересчет итогов в регл. задание. каждый день, 5-го числа месяца; с 3:00:00 один раз в день. :)
  15. TriviumFan
    Offline

    TriviumFan Опытный в 1С Заблокирован

    Регистрация:
    19 мар 2013
    Сообщения:
    92
    Симпатии:
    15
    Баллы:
    29
    Так ты глянь в настройках управления итогами, считаются ли они для этих регистров.
    Если считаются, то проверь правильность задания параметров периода, они должны быть на начало месяцев (н-р, дата начала = 01.08.14 00:00:00 и дата окончания = 01.09.14 00:00:00).
  16. vartanet
    Offline

    vartanet Опытный в 1С Команда форума

    Регистрация:
    16 ноя 2010
    Сообщения:
    2.698
    Симпатии:
    15
    Баллы:
    29
    Код:
    ВЫБРАТЬ
        ПродажиОбороты.СтоимостьОборот,
        ПродажиОбороты.ПериодМесяц,
        ПродажиОбороты.ПериодКвартал,
        ПродажиОбороты.ПериодГод
    ПОМЕСТИТЬ вт_Продажи
    ИЗ
        РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, Авто, Номенклатура В ИЕРАРХИИ (&Номенклатура)) КАК ПродажиОбороты
    ;
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        ПродажиСебестоимостьОбороты.СтоимостьОборот,
        ПродажиСебестоимостьОбороты.ПериодМесяц,
        ПродажиСебестоимостьОбороты.ПериодКвартал,
        ПродажиСебестоимостьОбороты.ПериодГод
    ПОМЕСТИТЬ вт_Себестоимость
    ИЗ
        РегистрНакопления.ПродажиСебестоимость.Обороты(&НачалоПериода, &КонецПериода, Авто, Номенклатура В ИЕРАРХИИ (&Номенклатура)) КАК ПродажиСебестоимостьОбороты
    ;
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        ЕСТЬNULL(вт_Продажи.ПериодМесяц, вт_Себестоимость.ПериодМесяц) КАК ПериодМесяц,
        ЕСТЬNULL(вт_Продажи.ПериодКвартал, вт_Себестоимость.ПериодКвартал) КАК ПериодКвартал,
        ЕСТЬNULL(вт_Продажи.ПериодГод, вт_Себестоимость.ПериодГод) КАК ПериодГод,
        ЕСТЬNULL(вт_Продажи.СтоимостьОборот, 0) КАК Стоимость,
        ЕСТЬNULL(вт_Себестоимость.СтоимостьОборот, 0) КАК Себестоимость,
        ЕСТЬNULL(вт_Продажи.СтоимостьОборот, 0) - ЕСТЬNULL(вт_Себестоимость.СтоимостьОборот, 0) КАК Прибыль
     
    ИЗ
        вт_Продажи КАК вт_Продажи,
        вт_Себестоимость КАК вт_Себестоимость
    --- Объединение сообщений, 3 окт 2014 ---
    на терабайтной базе 4,5 секунды работает..
    --- Объединение сообщений, 3 окт 2014 ---
    сразу получает и год, и квартал, и месяц..
    --- Объединение сообщений, 3 окт 2014 ---
    текущий год ограничение по периоду ставил..
    --- Объединение сообщений, 3 окт 2014 ---
    ограничения по номенклатуре - несколько десятков тысяч..
    Последнее редактирование модератором: 3 окт 2014
  17. TriviumFan
    Offline

    TriviumFan Опытный в 1С Заблокирован

    Регистрация:
    19 мар 2013
    Сообщения:
    92
    Симпатии:
    15
    Баллы:
    29
    А что у тебя в номенклатуре? десяток элементов?)
    У него наверно тысячи.
    Ясн
    Значит дело было не в бабине :)
  18. TopicStarter Overlay
    Vladius
    Offline

    Vladius Опытный в 1С

    Регистрация:
    10 ноя 2010
    Сообщения:
    663
    Симпатии:
    3
    Баллы:
    29
    Взял ваш запрос, тупо скопипастил ничего не менял :)

    Месяц - 30 сек.
    Квартал - 1 минута 20 сек
    Год - 3 минуты 10 сек.

    Походу у нас что то с базой -Banghead-
  19. Draco
    Offline

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

    Регистрация:
    28 окт 2009
    Сообщения:
    13.639
    Симпатии:
    948
    Баллы:
    204
    Два вопроса
    1. У Вас база скульная или файловая
    2. У Вас ограничение на уровне записей есть?
  20. Draco
    Offline

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

    Регистрация:
    28 окт 2009
    Сообщения:
    13.639
    Симпатии:
    948
    Баллы:
    204
    Поясняю по своим вопросам.

    1. если скульная то тогда можно посмотреть что с лог файлом и какого он размера, собирается ли статистика ит.д для оптимального построения запроса.
    2. если файловая база и вариант 2 чо используются ограничения, ну даже можно и без них попробовать. То можно попробовать запустить данный отчет в привелигированном режиме, что бы он не тормозил на проверку прав доступа т.д.
    Последнее редактирование модератором: 3 окт 2014
Статус темы:
Закрыта.

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