Имя: Пароль:
1C
1С v8
Разработка и оптимизация запросов 1С
0 sinisterfrag
 
23.09.12
11:36
1. Я за первый запрос 67% (2)
2. Я за второй запрос 33% (1)
Всего мнений: 3

На инфортарте смотрел курс "Разработка и оптимизация запросов 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 раз обращение к данным

Я за первый запрос
2 + 2 = 3.9999999999999999999999999999999...