Имя: Пароль:
1C
1С v8
Скорость выполнения запросов по оборотам с отбором по виду документа.
0 Lex_Liven
 
12.07.15
21:09
Всем привет. Собственно, это не вопрос, просто хочу поделиться наблюдением, которое меня удивило.

Задача: получить обороты по продажам без возвратов.
Делаю два запроса.
Первый:

    Запрос.Текст =
        "ВЫБРАТЬ
        |    ПродажиОбороты.СтоимостьОборот КАК Сумма
        |ИЗ
        |    РегистрНакопления.Продажи.Обороты(
        |            &ДатаНач,
        |            &ДатаКон,
        |            ,
        |            Подразделение = &Подразделение
        |                И Организация = &Организация
                |                               ТИПЗНАЧЕНИЯ(ПродажиОбороты.ДокументПродажи) = &ТипДокументРеализация) КАК ПродажиОбороты";
    Запрос.УстановитьПараметр("ДатаНач", НачалоДня(Дата));
    Запрос.УстановитьПараметр("ДатаКон", КонецДня(Дата));
    Запрос.УстановитьПараметр("Организация", Организация);
    Запрос.УстановитьПараметр("Подразделение", Подразделение);
    Запрос.УстановитьПараметр("ТипДокументРеализация", Тип("ДокументСсылка.РеализацияТоваровУслуг"));


Второй:

    Запрос.Текст =
        "ВЫБРАТЬ
        |    ПродажиОбороты.СтоимостьОборот КАК Сумма
        |ИЗ
        |    РегистрНакопления.Продажи.Обороты(
        |            &ДатаНач,
        |            &ДатаКон,
        |            ,
        |            Подразделение = &Подразделение
        |                И Организация = &Организация) КАК ПродажиОбороты
        |ГДЕ
        |    ТИПЗНАЧЕНИЯ(ПродажиОбороты.ДокументПродажи) = &ТипДокументРеализация";
    Запрос.УстановитьПараметр("ДатаНач", НачалоДня(Дата));
    Запрос.УстановитьПараметр("ДатаКон", КонецДня(Дата));
    Запрос.УстановитьПараметр("Организация", Организация);
    Запрос.УстановитьПараметр("Подразделение", Подразделение);
    Запрос.УстановитьПараметр("ТипДокументРеализация", Тип("ДокументСсылка.РеализацияТоваровУслуг"));


Удивление мое было в том, что второй запрос выполняется в 9 раз(!) быстрее! (По данным замера производительности)
1 RomanYS
 
12.07.15
21:14
SQL?
А теперь выполни их в обратном порядке
2 RomanYS
 
12.07.15
21:15
Кстати а результат одинаковый? или второй возвращает по строке на каждую реализацию
3 Lex_Liven
 
12.07.15
21:16
(1) файловая база.
Что значит в обратном порядке? Сначала второй, потом следом первый?
Проверю.
(2) Тоже проверю.
4 Lex_Liven
 
12.07.15
21:20
(1) Выполнил в обратном порядке. Результаты те же - запрос, который отбирает через "ГДЕ" работает в 9 раз быстрее.
5 RomanYS
 
12.07.15
21:22
Ну тогда еще сравни с условием "ДокументПродажи ССЫЛКА Документ.РеализацияТоваровУслуг" тоже обоими способами
(4) действительно странно
6 Lex_Liven
 
12.07.15
21:23
(2) Проверил число результатов выборки - ОДИНАКОВОЕ.
7 Lex_Liven
 
12.07.15
21:24
(5) Я сначала пробовал так: "ТИПЗНАЧЕНИЯ(ДокументПродажи)=ТИП(ДокументССылка.РеализацияТоваровУслуг)"

Тоже работало медленней, чем первый вариант.
8 RomanYS
 
12.07.15
21:25
замерь (5) интересно
Тип дает больше возможностей чем "ссылка", вопрос скорости
9 Lex_Liven
 
12.07.15
21:27
(5) Замерил.
ТИПЗНАЧЕНИЯ(ПродажиОбороты.ДокументПродажи) = &ТипДокументРеализация
Процентов на 20% медленнее.
Сейчас для верности поменяю их местами.
10 RomanYS
 
12.07.15
21:29
(9) сделай условие как в (5)
11 Lex_Liven
 
12.07.15
21:29
(5)(9)Поменял местами. Теперь результаты почти совпали, но ССЫЛКА - чуть медленнее.

    Обработка.ФронтКассира.Форма.Форма.Форма    137    РезультатЗапроса = Запрос.Выполнить();    45    0,176614    7,68

    Обработка.ФронтКассира.Форма.Форма.Форма    137    РезультатЗапроса = Запрос.Выполнить();    45    0,176614    7,68
12 Lex_Liven
 
12.07.15
21:29
Сорри, не то
13 Lex_Liven
 
12.07.15
21:30
ССЫЛКА:
    Обработка.ФронтКассира.Форма.Форма.Форма    137    РезультатЗапроса = Запрос.Выполнить();    45    0,176614    7,68

Параметр:
    Обработка.ФронтКассира.Форма.Форма.Форма    105    РезультатЗапроса = Запрос.Выполнить();    45    0,171578    7,46
14 Lex_Liven
 
12.07.15
21:31
В первом сравнении (Когда сначала через парметр, потом ССЫЛКА) было так:
Параметр:
    Обработка.ФронтКассира.Форма.Форма.Форма    105    РезультатЗапроса = Запрос.Выполнить();    36    0,157122    7,36

ССЫЛКА:
    Обработка.ФронтКассира.Форма.Форма.Форма    137    РезультатЗапроса = Запрос.Выполнить();    36    0,126894    5,94
15 Lex_Liven
 
12.07.15
21:33
Кто-нибудь может провести такой же эксперимент на SQL?
16 vde69
 
12.07.15
21:51
собственно ничего удивительного, тип значения не индексируемое поле а значит если оно есть в условии будет фул скан,

то есть фул скан физической таблицы на 1 лям записей конечно медленее чем сначало отбор 10 тысяч по индексу а потом фул скан этих 10 тыс.
17 H A D G E H O G s
 
12.07.15
21:54
(16) глупости какие
18 vde69
 
12.07.15
21:55
(17) почему глупости?
19 Lex_Liven
 
12.07.15
22:04
(18) С фига ли тип регистратора не индексирован?
20 H A D G E H O G s
 
12.07.15
22:06
(18) с вероятность в 99% там будет поиск по кластерному индексу с условием по периоду
21 H A D G E H O G s
 
12.07.15
22:09
(16) тип значения, кстати, индексируемое поле, но тут это не поможет
22 karabas11
 
12.07.15
23:22
Глупостями занимаетесь. Работает и ладно. Вы бы еще порядок отборов начали в вирт таблице проверять. Хотя... А почему не проверили? :)
23 PR третий
 
12.07.15
23:26
(3) Ну, файловая база — это в принципе сразу все объясняет.
И еще то, что в случае сложного отбора в первом случае видимо не используется виртуальная таблица.
24 PR третий
 
12.07.15
23:27
(17) Почему?
25 PR третий
 
12.07.15
23:27
(19) Регистратор индексирован, но у тебя же отбор по типузначения.
26 PR третий
 
12.07.15
23:28
(20) А по типу значения как делать отбор?
27 H A D G E H O G s
 
12.07.15
23:58
(24) Я объяснил ниже.
(23) (26) Роман Печенкин, как ушел от Мебиуса, такую иногда такую ересь гнать, что диву даешься.
28 H A D G E H O G s
 
13.07.15
00:06
Вы ребята, не страдайте, просто предположите, какие индексы и насколько будут использоваться.

1) Некластерный индекс по Организации и Периоду (полностью) с key look-up в таблицу данных
либо
2) Кластерный индекс по Периоду и остаточный просмотр данных.

Если обороты в тот день (а там период за один день) были в основном по указанной организации и подразделению, то будет вариант 2, иначе вариант 1.

Некластерный индекс по ДокументПродажи тут вообще не будет использоваться, как так он будет использован только по 2 полям (из четырех) в результате в остаточный предикат поиска попадет условие на период. Дефакто запрос отыщет все обороты с типом ДокументПродажи=РТУ и будет лопатить эту портянку до умопомрачения.
29 PR третий
 
13.07.15
00:17
(28) Что-то я не заметил, где в твоих рассуждениях отбор по типу регистратора?
30 H A D G E H O G s
 
13.07.15
00:22
(29) Какого регистратора? Почитай (0). Внимательно.
31 PR третий
 
13.07.15
00:43
(30) Да, документа продажи конечно же
32 GROOVY
 
13.07.15
01:30
Смотреть план запроса и пользоваться профайлером не предлагать, так погадаем...
33 Лодырь
 
13.07.15
03:38
(32) Надо же прокачивать телепатию.
34 Lex_Liven
 
13.07.15
09:33
О чем война пошла? Я просто поделился наблюдением, неочевидным на мой взгляд. Если кому-то поможет этот пост, я буду рад.
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший