Оптимизация запроса

  1. 8 г. назад
    03.08.2016 10:54:18 отредактировано Fynjy

    Кусок типового запроса

    ВЫБРАТЬ
        НомХар.Номенклатура,
        НомХар.Характеристика,
        УпаковкиНоменклатуры.Ссылка
    ИЗ
        Справочник.УпаковкиНоменклатуры КАК УпаковкиНоменклатуры
            ВНУТРЕННЕЕ СОЕДИНЕНИЕ НомХар КАК НомХар
            ПО (УпаковкиНоменклатуры.Владелец = НомХар.Номенклатура
                    ИЛИ УпаковкиНоменклатуры.Владелец = НомХар.НаборУпаковок)
    ГДЕ
        НомХар.Номенклатура В ИЕРАРХИИ(&П2)
    

    Nested Loop по вот этой строке

     
    ИЛИ УпаковкиНоменклатуры.Владелец = НомХар.НаборУпаковок
    
  2. Какие ваши доказательства предложения?

  3. Перенести ГДЕ в раздел Соединений

    Ответы: (3)
  4. (2) не критично - можно вообще удалить, так как НомХар - уже выгреб номенклатуру по этому условию

  5. Жопа здесь

     ПО (УпаковкиНоменклатуры.Владелец = НомХар.Номенклатура
                    ИЛИ УпаковкиНоменклатуры.Владелец = НомХар.НаборУпаковок) //конкретно в или
    

    НомХар.НаборУпаковок - у всех номенклатур ссылка на элемент справочника

    Ответы: (11)
  6. в НомХар - сколько записей? попробуй проиндексировать по "НаборУпаковок" и/или местами условия поменять в "или"

  7. у тебя получается, что первое условие ложь, а чтобы проверить второе, он ищет nested loop.

    Ответы: (7)
  8. (6) я планирую переписать запрос, разделить на два

    Ответы: (9)
  9. первый по Номенклатуре, второй по Набору и соединение к первому

    Ответы: (9)
  10. (7)(8) тут подсказывать ни о чем. непонятно общее количество записей.
    про ГДЕ уже написали, еще моветон использовать "в иерархии"

    Ответы: (10)
  11. (9) в среднем с отборами в районе 5-10 тысяч во вложеной таблице, в справочнике номенклатура, под 1 лям и 2,5 ляма в упаковках

  12. (4) Стандартный способ избавиться от плохого ИЛИ в условии - распилить на 2 запроса в каждом по одной половинке условия и объединить все.

    Ответы: (12)
  13. (11) А если много "Или " встречаются, под каждые создавать условия?)

    Ответы: (14)
  14. * точнее под кадое или создавать "Объединение запросов"

  15. (12) плохого ИЛИ

  16. С множеством ИЛИ хорошо копрокодеру, но тяжело планировщику и наоборот.

    Ответы: (16)
  17. (15) просто есть отчеты, которые вытягивают данные из справочника, к котором много реквизитов булевого типа, и для каждой строчки отчета надо прописывать условия по эти реквизитам, приходится проставлять "Или"

    Ответы: (17)
  18. (16) Это "или" без нестид лупа.

    Ответы: (18)
  19. (17) Не понял а что такое "нестид лупа"?

    Ответы: (19) (20)
  20. (18) wiki:Nested_loop_join

  21. (18) это лупа, но не хеден

  22. Всем привет! Как бы вы оптимизировали этот запрос?

    1) Данные клиенты брали у нас кредит в период с 01.01.2014 -01.01.2016;
    2) Кредит на сегодняшняю дату –погашен;
    3) За время пользования кредитом – были допустимые просрочки но не более 30 дней;
    4) Обращались данные клиенты не более одного раза, т.е. в момент оформления займа, более к нам не обращались;
    5) Помимо ФИО и номера телефона, прошу дать данные по ним сумму и срок заакрытого кредита у нас, а также город и дату обращения и закрытия кредита.

    ВЫБРАТЬ
        КредитыОстаткиИОбороты.Заемщик КАК Заемщик,
        КОЛИЧЕСТВО(РАЗЛИЧНЫЕ КредитыОстаткиИОбороты.Договор) КАК КоличествоДоговоров
    ПОМЕСТИТЬ ТЧКоличествоДоговров
    ИЗ
        РегистрНакопления.Кредиты.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, , , ) КАК КредитыОстаткиИОбороты
    ГДЕ
        КредитыОстаткиИОбороты.КоличествоДнейПросрочкиПриход <= 30
        И КредитыОстаткиИОбороты.ОсновнойДолгКонечныйОстаток <= 0
        И КредитыОстаткиИОбороты.ВознаграждениеКонечныйОстаток <= 0
        И КредитыОстаткиИОбороты.Договор.ДатаВыдачи <= &ДатаВыдачи
    
    СГРУППИРОВАТЬ ПО
        КредитыОстаткиИОбороты.Заемщик
    ;
    
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        ВложенныйЗапрос.Подразделение,
        ВложенныйЗапрос.КоличествоДоговоров, 
        ВложенныйЗапрос.Заемщик,
        ВложенныйЗапрос.Договор,
        ВложенныйЗапрос.ДоговорЭКЗмко_ТелефонМобильныйЗаемщика,
        ВложенныйЗапрос.СуммаВыданная,
        ВложенныйЗапрос.ДатаВыдачи,
        ВложенныйЗапрос.СрокКредита,
        ВложенныйЗапрос.ДоговорДатаПогашенияЗадолженности,
        ВложенныйЗапрос.ДоговорТекущийФилиалГород
    ИЗ
        (ВЫБРАТЬ
            КредитыОстаткиИОбороты.Организация КАК Подразделение,
            КредитыОстаткиИОбороты.Заемщик КАК Заемщик,
            КредитыОстаткиИОбороты.Договор КАК Договор,
            КредитыОстаткиИОбороты.Договор.ЭКЗ.мко_ТелефонМобильныйЗаемщика КАК ДоговорЭКЗмко_ТелефонМобильныйЗаемщика,
            СУММА(ВЫБОР
                    КОГДА КредитыОстаткиИОбороты.ОсновнойДолгКонечныйОстаток <= 0
                        ТОГДА ВЫБОР
                                КОГДА КредитыОстаткиИОбороты.ОсновнойДолгРасход <> КредитыОстаткиИОбороты.Договор.Сумма
                                    ТОГДА КредитыОстаткиИОбороты.Договор.Сумма
                                ИНАЧЕ КредитыОстаткиИОбороты.ОсновнойДолгРасход
                            КОНЕЦ
                    ИНАЧЕ КредитыОстаткиИОбороты.Договор.Сумма
                КОНЕЦ) КАК СуммаВыданная,
            КредитыОстаткиИОбороты.Договор.ГрафикПогашенияДок.Дата КАК ДатаВыдачи,
            КредитыОстаткиИОбороты.Договор.СрокКредита КАК СрокКредита,
            КредитыОстаткиИОбороты.Договор.ДатаПогашенияЗадолженности КАК ДоговорДатаПогашенияЗадолженности,
            КредитыОстаткиИОбороты.Договор.ТекущийФилиал.Город КАК ДоговорТекущийФилиалГород,
            ТЧКоличествоДоговров.КоличествоДоговоров КАК КоличествоДоговоров
        ИЗ
            РегистрНакопления.Кредиты.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, , , ) КАК КредитыОстаткиИОбороты
                Левое СОЕДИНЕНИЕ ТЧКоличествоДоговров КАК ТЧКоличествоДоговров
                ПО КредитыОстаткиИОбороты.Заемщик = ТЧКоличествоДоговров.Заемщик
        ГДЕ
            КредитыОстаткиИОбороты.КоличествоДнейПросрочкиПриход <= 30
            И КредитыОстаткиИОбороты.ОсновнойДолгКонечныйОстаток <= 0
            И КредитыОстаткиИОбороты.ВознаграждениеКонечныйОстаток <= 0
            И КредитыОстаткиИОбороты.Договор.ДатаВыдачи <= &ДатаВыдачи
        
        СГРУППИРОВАТЬ ПО
            КредитыОстаткиИОбороты.Заемщик,
            КредитыОстаткиИОбороты.Договор,
            КредитыОстаткиИОбороты.Договор.ГрафикПогашенияДок.Дата,
            КредитыОстаткиИОбороты.Договор.СрокКредита,
            КредитыОстаткиИОбороты.Организация,
            КредитыОстаткиИОбороты.Договор.ДатаПогашенияЗадолженности,
            КредитыОстаткиИОбороты.Договор.ТекущийФилиал.Город,
            КредитыОстаткиИОбороты.Договор.ЭКЗ.мко_ТелефонМобильныйЗаемщика,
            ТЧКоличествоДоговров.КоличествоДоговоров) КАК ВложенныйЗапрос
            
            ГДЕ
            ВложенныйЗапрос.КоличествоДоговоров<2 
    
    
    Ответы: (22)
  23. (21) это работает ?
    странно

    Ответы: (23)
  24. (22) Да, а почему странно)))

    Ответы: (24)
  25. (23) Двойное
    ГДЕ
    КредитыОстаткиИОбороты.КоличествоДнейПросрочкиПриход <= 30
    И КредитыОстаткиИОбороты.ОсновнойДолгКонечныйОстаток <= 0
    И КредитыОстаткиИОбороты.ВознаграждениеКонечныйОстаток <= 0
    И КредитыОстаткиИОбороты.Договор.ДатаВыдачи <= &ДатаВыдачи

    доставляет

    Ответы: (25)
  26. (24) ну там разные таблицы же, но отбор надо один наложиьт)

    Ответы: (26)
  27. 23.08.2016 20:46:20 отредактировано sf

    (25) наперкуа вложенность во втором запросе, да и вообще первый запрос? Пиши сразу условие "имеющие количество(различные договор) =1"

    Ответы: (27) (28) (29)
  28. (26) так мне ж сгруппировать надо а во второй таблце я договор выбираю и его поля и не получится сгруппировать

    Ответы: (28)
  29. NewTesla (26) так мне ж сгруппировать надо а во второй таблце я договор выбираю и его поля и не получится сгруппировать

    Ты вообще в сиквеле не понимаешь или не хочешь?

  30. Книжку почитай, что ли.
    Один запрос, без вложенных таблиц тут. Читай (26) до просветления

    Ответы: (30) (32)
  31. (29) да не могет такого быть) я даж не формируя знаю, что не сгруппирует))) но из уважеия к вам попробую завтра и отпишусь, кстати, а вы предлагаете условие на вложенный запрос поставить, или даже не надо вложенного делать?

  32. Но меня болше интересует как бы вы обошлись с таблицей номер 1= временной таблицей? Мне пришлось за вель период делать выборку, тк я не могу остатки по количеству дней взять- они нулевые, пришлось приход. и соответсвенно большой период, а как бы вы поступили?

    Ответы: (32)
  33. NewTesla а как бы вы поступили?

    sf Книжку почитай, что ли.

    хотя тебе похоже ничего не поможет. не твое это

    Ответы: (33)
  34. (32) Да лан, правда чтоле))))

    Ответы: (34) (35)
  35. (33) ты не можешь или хочешь написать элементарные скульные запросы?

    Ответы: (36)
  36. (33) пошёл был лучше песни петь

  37. (34) Как бы ты написал покажи

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

        КредитыОстаткиИОбороты.Заемщик КАК Заемщик,
        КОЛИЧЕСТВО(РАЗЛИЧНЫЕ КредитыОстаткиИОбороты.Договор) КАК КоличествоДоговоров
    ПОМЕСТИТЬ ТЧКоличествоДоговров
    ИЗ
        РегистрНакопления.Кредиты.ОстаткиИОбороты(&КонецПериода, &КонецПериода, , , ) КАК КредитыОстаткиИОбороты
    
    СГРУППИРОВАТЬ ПО
        КредитыОстаткиИОбороты.Заемщик
    
    Ответы: (40) (43)
  39. как быть в таком случае кто подскажет?)

    Ответы: (39)
  40. (38) сделать левое соединение с заемщиками

    Ответы: (42)
  41. 24.08.2016 19:12:06 отредактировано sda553

    (37) Я вообще не понимаю, зачем тут ОстаткиИОбороты используются?

    Ответы: (41) (43)
  42. (40) гениально!!!!!!!!!!!!!!!!!!

  43. (39) Один вопрос вы помогли мне решить, спасибо!) Но на будущее интересно все-же ка кэто сделать с помощью регистра ОстаткиИОбороты, тк это может пригодиться в дальнейшем) Т.е суть вопроса в том как получить данные по изменениям, используя в качестве периода последний день месяца , если русурсы введены в нуль, т.е. данных по ним не будет и будут три строчки, хтя заемщиков 4 , например

  44. sda553 (37) Я вообще не понимаю, зачем тут ОстаткиИОбороты используются?

    Ты бы ещё спросил почему он во втором запросе соединяет, а не в параметрах фильтрует

    Ответы: (44)
  45. (43) как вы хотите отфильтровать в параметрах? Заемщик не в(Тч.Заемщик из ТЧ как ТЧ)?

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