|
Разработка и оптимизация запросов 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 раз обращение к данным
Я за первый запрос |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |