|   |   | 
| 
 | Разработка и оптимизация запросов 1С | ☑ | ||||||
|---|---|---|---|---|---|---|---|---|
| 0
    
        sinisterfrag 23.09.12✎ 11:36 | 
 
        На инфортарте смотрел курс "Разработка и оптимизация запросов 1С", думал может найду что то новое для себя. В ходе просмотра (собственно ссылка http://infostart.ru/public/140321/) уроков части 3, наткнулся вот на такой запрос т.к. в видео курсе ключевое слово "ОПТИМИЗАЦИЯ"
  решил выставить на голосовалку вот такой запрос. Автор в Части 3(20-25 минуте) разберает приблезительно вот такой запрос 1) "ВЫБРАТЬ | ПродажиОбороты.Товар, | ВЫБОР | КОГДА ПродажиОбороты.Товар.ВидНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Товар) | ТОГДА ЕСТЬNULL(ПродажиОбороты.СуммаОборот, 0) | ИНАЧЕ 0 | КОНЕЦ КАК СуммаТовара, | ВЫБОР | КОГДА ПродажиОбороты.Товар.ВидНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Услуга) | ТОГДА ЕСТЬNULL(ПродажиОбороты.СуммаОборот, 0) | ИНАЧЕ 0 | КОНЕЦ КАК СуммаУслуг |ИЗ | РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты" 2) И собсвенно мой вариант запроса "ВЫБРАТЬ | ПродажиОбороты.Товар, | ПродажиОбороты.СуммаОборот КАК СуммаТовара, | 0 КАК СуммаУслуг |ИЗ | РегистрНакопления.Продажи.Обороты(, , , Товар.ВидНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Товар)) КАК ПродажиОбороты | |ОБЪЕДИНИТЬ ВСЕ | |ВЫБРАТЬ | ПродажиОбороты.Товар, | 0, | ПродажиОбороты.СуммаОборот |ИЗ | РегистрНакопления.Продажи.Обороты(, , , Товар.ВидНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Услуга)) КАК ПродажиОбороты" | |||||||
| 1
    
        Aleksey 23.09.12✎ 11:38 | 
        А где результаты теста?     | |||||||
| 2
    
        ДенисЧ 23.09.12✎ 11:39 | 
        в первом запросе выполняется один запрос, во втором - два. И что оптимальней?     | |||||||
| 3
    
        petrowsky 23.09.12✎ 11:40 | 
        (0) я бы сперва обороты поместил во временную таблицу,
  а дальше как во втором запросе | |||||||
| 4
    
        sinisterfrag 23.09.12✎ 11:47 | 
        Допустим записей ~ 1 миллион в первом случае sql server для каждой записи будет делать сравнение 
  а во втором никаких сравнений ненадо делать по записям. Соответственно что быстрее 1 миллион сравнений VS 2 запроса с отбором. Я за второй запрос | |||||||
| 5
    
        sinisterfrag 23.09.12✎ 11:50 | 
        (3) Сохранение запроса во врем таблицу фактически = записать на диск результат запроса, соотв. тратится время на запись на физический носитель.     | |||||||
| 6
    
        petrowsky 23.09.12✎ 11:51 | 
        (5) если это делать пакетами в одном запросе?     | |||||||
| 7
    
        vde69 23.09.12✎ 11:55 | 
        в первом варианте виртуальная таблица без параметров - это плохо, во втором два запроса - тоже плохо.
  если нет дополнительного отбора то вообще следует использовать физическую таблица а не виртуальную | |||||||
| 8
    
        H A D G E H O G s 23.09.12✎ 12:01 | 
        ВЫБРАТЬ
  Номенклатура.Ссылка КАК Ссылка, Номенклатура.ВидНоменклатуры ПОМЕСТИТЬ ГоднаяНоменклатура ИЗ Справочник.Номенклатура КАК Номенклатура ГДЕ Номенклатура.ВидНоменклатуры В (ЗНАЧЕНИЕ(Справочник.ВидыНоменклатуры.Товар), ЗНАЧЕНИЕ(Справочник.ВидыНоменклатуры.Услуга)) ИНДЕКСИРОВАТЬ ПО Ссылка ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ПродажиОбороты.Номенклатура, СУММА(ВЫБОР КОГДА ГоднаяНоменклатура.ВидНоменклатуры = ЗНАЧЕНИЕ(Справочник.ВидыНоменклатуры.Товар) ТОГДА ПродажиОбороты.СтоимостьОборот ИНАЧЕ 0 КОНЕЦ) КАК СуммаТовара, СУММА(ВЫБОР КОГДА ГоднаяНоменклатура.ВидНоменклатуры = ЗНАЧЕНИЕ(Справочник.ВидыНоменклатуры.Услуга) ТОГДА ПродажиОбороты.СтоимостьОборот ИНАЧЕ 0 КОНЕЦ) КАК СуммаУслуг ИЗ РегистрНакопления.Продажи.Обороты( , , , Номенклатура В (ВЫБРАТЬ ГоднаяНоменклатура.Ссылка ИЗ ГоднаяНоменклатура КАК ГоднаяНоменклатура)) КАК ПродажиОбороты ВНУТРЕННЕЕ СОЕДИНЕНИЕ ГоднаяНоменклатура КАК ГоднаяНоменклатура ПО ПродажиОбороты.Номенклатура = ГоднаяНоменклатура.Ссылка СГРУППИРОВАТЬ ПО ПродажиОбороты.Номенклатура | |||||||
| 9
    
        H A D G E H O G s 23.09.12✎ 12:04 | 
        (5) Расскажи об этом sql серверу.     | |||||||
| 10
    
        petrowsky 23.09.12✎ 12:11 | 
        ВЫБРАТЬ
  ПродажиОбороты.Товар КАК Товар, ПродажиОбороты.Товар.ВидНоменклатуры КАК ВидНоменклатуры, ПродажиОбороты.СуммаОборот КАК СуммаОборот ПОМЕСТИТЬ ВТ ИЗ РегистрНакопления.Продажи.Обороты( , , , Товар.ВидНоменклатуры = ЗНАЧЕНИЕ(Справочник.ВидыНоменклатуры.Товар) ИЛИ Товар.ВидНоменклатуры = ЗНАЧЕНИЕ(Справочник.ВидыНоменклатуры.Услуга)) КАК ПродажиОбороты ИНДЕКСИРОВАТЬ ПО ВидНоменклатуры ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВТ1.Товар КАК Товар, ВТ1.СуммаОборот КАК СуммаТовара, 0 КАК СуммаУслуг ИЗ ВТ КАК ВТ1 ГДЕ ВТ1.ВидНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Товар) ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ВТ2.Товар, 0, ВТ2.СуммаОборот ИЗ ВТ КАК ВТ2 ГДЕ ВТ2.ВидНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Услуга) | |||||||
| 11
    
        kuromanlich 23.09.12✎ 12:12 | 
        (8) ну если зашизеть, то можно не заставлять тратиться скуль на вычисление "В", т.е. сначала пакет на один вид номенклатуры, потом на другой, итого 3 запроса )     | |||||||
| 12
    
        kuromanlich 23.09.12✎ 12:12 | 
        (11) + индексирование конечно же )     | |||||||
| 13
    
        H A D G E H O G s 23.09.12✎ 12:14 | 
        (10) Плохо. Очень плохо.     | |||||||
| 14
    
        kuromanlich 23.09.12✎ 12:14 | 
        (10) на ИЛИ тратиться время     | |||||||
| 15
    
        Dimasik2007 23.09.12✎ 12:14 | 
        Проверка показала на типовом РН Продажи с отбором не по перечислению (ВидНоменклатуры), а по справочнику (т.е. используются параметры запроса), на 3х летних данных:
  1 запрос - 435мс 2 запрос - 455мс "Холодный" первый запрос 1,5с, второй - 1,8 с. Я за первый запрос | |||||||
| 16
    
        H A D G E H O G s 23.09.12✎ 12:15 | 
        (14) И ты Брут.     | |||||||
| 17
    
        kuromanlich 23.09.12✎ 12:15 | 
        (14)+ второй отбор не пойми зачем во втором запросе     | |||||||
| 18
    
        Dimasik2007 23.09.12✎ 12:16 | 
        (8)- запрос отсюда 318мс     | |||||||
| 19
    
        kuromanlich 23.09.12✎ 12:16 | 
        (15) а на какой базе?     | |||||||
| 20
    
        H A D G E H O G s 23.09.12✎ 12:18 | 
        (18) Ты "холодный" говори, не ленись.     | |||||||
| 21
    
        kuromanlich 23.09.12✎ 12:18 | 
        (19) + скуль файловая?     | |||||||
| 22
    
        Dimasik2007 23.09.12✎ 12:19 | 
        (18)  Пардон, вытаскивал только номенклатуру, в примерах выше была и характеристика. С данными характеристики запрос выполняется 637мс     | |||||||
| 23
    
        H A D G E H O G s 23.09.12✎ 12:19 | 
        (21) Ну конечно sql, если речь про холодно-горячо.     | |||||||
| 24
    
        kuromanlich 23.09.12✎ 12:21 | 
        (23) а почему "ИНДЕКСИРОВАТЬ ПО Ссылка" ? что первее происходит? чтение или связь? в чтении у тебя уже 2 поля с условиями по виду номенклатуры...     | |||||||
| 25
    
        Dimasik2007 23.09.12✎ 12:21 | 
        (19) База УПП, SQL как ни странно)     | |||||||
| 26
    
        H A D G E H O G s 23.09.12✎ 12:24 | 
        (24) Ниче не понял из твоего вопроса.     | |||||||
| 27
    
        H A D G E H O G s 23.09.12✎ 12:24 | 
        (25) Сколько записей в продажах за период запроса?     | |||||||
| 28
    
        kuromanlich 23.09.12✎ 12:27 | 
        (26) если использовать вместо индексирования по ссылке индексирование по виду, то может быстрее будет изза того, что именно по этому полю у тебя происходят вычисление полей СуммаТовара и СуммаУслуг?     | |||||||
| 29
    
        H A D G E H O G s 23.09.12✎ 12:27 | 
        (28) С чего бы?     | |||||||
| 30
    
        H A D G E H O G s 23.09.12✎ 12:28 | 
        Я соединение по ссылке делаю. По индексированной ссылке.     | |||||||
| 31
    
        kuromanlich 23.09.12✎ 12:28 | 
        нужно 2 пакета сначала с отбором и индексом по ссылке для каждого вида товара, а третий связь по ссылке без всяких вычилений полей - ИМХО конечно...     | |||||||
| 32
    
        kuromanlich 23.09.12✎ 12:29 | 
        (30) я понял, просто хотел узнать вдруг и на вычисляемые поля наличие дополнительного индекса по виду будет иметь влияние     | |||||||
| 33
    
        Dimasik2007 23.09.12✎ 12:29 | 
        (25) Всего лишь 300кк     | |||||||
| 34
    
        Dimasik2007 23.09.12✎ 12:31 | 
        300к     | |||||||
| 35
    
        H A D G E H O G s 23.09.12✎ 12:32 | 
        (32) Думаю, что нет.     | |||||||
| 36
    
        H A D G E H O G s 23.09.12✎ 12:32 | 
        (33) 300 тыс? Пфффф :-)     | |||||||
| 37
    
        Dimasik2007 23.09.12✎ 12:33 | 
        Профит не в количестве продаж, а в рентабельности)))     | |||||||
| 38
    
        mistеr 23.09.12✎ 15:10 | 
        (4) "Допустим записей ~ 1 миллион в первом случае sql server для каждой записи будет делать сравнение а во втором никаких сравнений ненадо делать по записям."
  Отлично! А условие в параметрах вирт. таблицы это не сравнение? А вообще пример надуманный, т.к. в реальности есть условия хотя бы на период, соответственно сервер будет по-другому выполнять запрос. | |||||||
| 39
    
        Fragster гуру 23.09.12✎ 15:16 | 
        1 раз обращение к данным     Я за первый запрос | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |