Имя: Пароль:
1C
 
Непонятно, почему один запрос быстрее другого.
,
0 Галахад
 
гуру
09.04.19
10:18
ВЫБРАТЬ
    СУММА(ПродажиОбороты.КоличествоОборот) КАК КоличествоОборот
ИЗ
    РегистрНакопления.Продажи.Обороты(&НачДата, &КонДата, , ) КАК ПродажиОбороты
ГДЕ
    ПродажиОбороты.Склад В ИЕРАРХИИ(&Склад)
    И НЕ ПродажиОбороты.Контрагент В ИЕРАРХИИ (&Контрагент)

3 секунды.

ВЫБРАТЬ
    СУММА(ПродажиОбороты.КоличествоОборот) КАК КоличествоОборот
ИЗ
    РегистрНакопления.Продажи.Обороты(
            &НачДата,
            &КонДата,
            ,
            Склад В ИЕРАРХИИ (&Склад)
                И НЕ Контрагент В ИЕРАРХИИ (&Контрагент)) КАК ПродажиОбороты

11 секунд.

Как так-то?
1 VladZ
 
09.04.19
10:20
(0) Видимо, хреново работает сравнение вида "Склад В ИЕРАРХИИ (&Склад) "
2 VladZ
 
09.04.19
10:22
Покажи результаты сравнения, в случае, когда " И НЕ Контрагент В ИЕРАРХИИ (&Контрагент) " в скобках и когда в условии "где".
3 sqr4
 
09.04.19
10:22
ну да наверно логично, это медленная операция применяется только к подобранным записям за период. А вторая при построении таблицы оборотов. А какой период указан?
4 Фрэнки
 
09.04.19
10:23
Это старый прикол

не нужно пытаться использовать В ИЕРАРХИИ в параметрах выборки других таблиц
5 palsergeich
 
09.04.19
10:25
ВИЕРАРХИИ не является оптимальным оператором.
Лучше сначала получить все элементы, потом засунуть в параметры Вирт таблицы.
6 Галахад
 
гуру
09.04.19
10:29
Понятно. Спасибо!
7 Галахад
 
гуру
09.04.19
10:47
Сделал 3 запроса. Двумя получил список контрагентов и складов.

Разница между этой громоздкой конструкцией и первым запросом всего 15%, кода получилось значительно больше. :-(
8 1Сергей
 
09.04.19
10:48
У вас сложная структура складов?
9 Фрэнки
 
09.04.19
10:52
И что тебе с того кода? Установлена некая граница на количество символов в текстах запросов?
10 Галахад
 
гуру
09.04.19
10:52
(8) Хм. Раньше об этом не задумывался.

Посмотрел. Да, больше 1000 складов. :-()
11 d4rkmesa
 
09.04.19
10:52
(0) А сколько запрос записей выдает, миллионы?
12 Галахад
 
гуру
09.04.19
10:53
(9) Ждал значительного изменения скорости.
13 d4rkmesa
 
09.04.19
10:54
3-й запрос покажите.
14 Галахад
 
гуру
09.04.19
10:54
(11) Да нет. Где-то в районе 20'000.
15 1Сергей
 
09.04.19
10:56
(10) сколько уровней макс?
16 seevkik
 
09.04.19
11:03
Ну почему-почему, в первой ты в Обороты() отбор установил, во второй нет
17 1Сергей
 
09.04.19
11:04
(16) может, наоборот? :)
18 Очевидно
 
09.04.19
11:05
(0)
Могу ошибаться но есть мнение:
Конструкция "В иерархии" на уровне MSSQL выполняется следуюшим образом : сначала 1С - формирует некую ВТ, куда выбирает элементы согласно структуре иерархии, а потом происходит соединение с таблицей, на которую вы накладываете это условие.
Получается когда вы ставите эту конструкцию в условие виртуальной таблицы - происходит неявное соединение с подзапросом (Формирования Вирт. таблицы Обороты), из-за этого MSSQL может некорректно оценивать текущую статистику и формировать не самый быстрый план запроса.

Если же вы выносите это условие в условия "Где" - у вас сначала формируется Виртуальная таблица с оптимальным планом , а потом на неё накладывается фильтр.
но т.к. неявного соединения с подзапросом отсутствует - виртуальная таблица строится по оптимальному плану. и это быстрее.
19 Очевидно
 
09.04.19
11:08
20 seevkik
 
09.04.19
11:08
(17) ну точняк, наоборот
Короче как мне кажется, если простым языком, то это из-за двух условий в виртуальной таблице
21 d4rkmesa
 
09.04.19
11:11
Слишком все неопределенно. Я бы проверил регламенты SQL, итоги, агрегаты. Если это стандартная УТ10/УПП, то там вроде нет измерения Склад в РН Продажи, проверить бы, установлено ли там свойство Индексировать измерения, если оно добавлено. А то может оно в итоге не включено или это вовсе реквизит.
22 Очевидно
 
09.04.19
11:15
(21) думаю чтобы внести определенность , было бы круто планы скуля посмотреть обоих запросов.
2 + 2 = 3.9999999999999999999999999999999...