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

  1. 7 г. назад
    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) как вы хотите отфильтровать в параметрах? Заемщик не в(Тч.Заемщик из ТЧ как ТЧ)?

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