Имя: Пароль:
1C
 
Возможно ли как-то поторопить запрос? ☑
0 Галахад
 
гуру
23.12.14
✎
06:26
ВЫБРАТЬ
    ПродажиОбороты.Период КАК Период,
    Ном.Ссылка КАК Номенклатура,
    ПродажиОбороты.Подразделение КАК Подразделение,
    ЕСТЬNULL(ПродажиОбороты.КоличествоОборот, 0) КАК КоличествоОборот,
    ЕСТЬNULL(ПродажиОбороты.СтоимостьОборот, 0) КАК СтоимостьОборот
ИЗ
    Справочник.Номенклатура КАК Ном
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи.Обороты(
                &Date1,
                &Date2,
                Месяц,
                Номенклатура В (&Номенклатура)
                    И Подразделение В (&Подразделение)) КАК ПродажиОбороты
        ПО (ПродажиОбороты.Номенклатура = Ном.Ссылка)
ГДЕ
    Ном.Ссылка В(&Номенклатура)

УПОРЯДОЧИТЬ ПО
    ПродажиОбороты.Номенклатура.Наименование
ИТОГИ
    СУММА(КоличествоОборот),
    СУММА(СтоимостьОборот)
ПО
    Номенклатура,
    Подразделение
1 чувак
 
23.12.14
✎
06:28
а соединение зачем?
2 Ник второй
 
23.12.14
✎
06:29
Нужно смотреть план запроса. Например можно вынести получение оборотов в отдельную ВТ.
3 Ник второй
 
23.12.14
✎
06:29
(1) Не догадываешся? Видимо что бы получить обороты продаж по номенклатуре и нулевой оборот это тоже оборот.
4 чувак
 
23.12.14
✎
06:30
"ГДЕ
    Ном.Ссылка В(&Номенклатура)"

Не знаю точно, но это надо в временной таблице сделать, а потом соединить. По моему соединение происходит до условия
5 Ник второй
 
23.12.14
✎
06:35
(4) Как оптимизатор решит так и будет, нужно смотреть план запроса.
6 Skom
 
23.12.14
✎
06:37
Вот это попробуй убрать
"Номенклатура В (&Номенклатура)"
7 Skom
 
23.12.14
✎
06:37
фильтр на виртуальную не накладывай. все равно при соединении у тебя отфильтруется, хотя все же лучше план запросов смотреть
8 floody
 
23.12.14
✎
07:09
соединение с виртуальной - переделать
9 Галахад
 
гуру
23.12.14
✎
07:29
(2) Спасибо, попробовал. Ощутимой разницы нет.

(4) Спасибо, попробовал. Ощутимой разницы нет.

(6) Спасибо, попробовал. Выполнилось на порядок медленнее.

(8) Что именно переделать?
10 чувак
 
23.12.14
✎
07:31
(9) А как ты сделал (4) ? Сможешь показать код?
11 Галахад
 
гуру
23.12.14
✎
07:32
ВЫБРАТЬ
    Ном.Ссылка КАК Номенклатура
ПОМЕСТИТЬ тТовары
ИЗ
    Справочник.Номенклатура КАК Ном
ГДЕ
    Ном.Ссылка В ИЕРАРХИИ(&Номенклатура)
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ПродажиОбороты.Период КАК Период,
    ПродажиОбороты.Подразделение КАК Подразделение,
    ПродажиОбороты.Номенклатура,
    ЕСТЬNULL(ПродажиОбороты.КоличествоОборот, 0) КАК КоличествоОборот,
    ЕСТЬNULL(ПродажиОбороты.СтоимостьОборот, 0) КАК СтоимостьОборот
ПОМЕСТИТЬ тПродажи
ИЗ
    РегистрНакопления.Продажи.Обороты(
            &Date1,
            &Date2,
            Месяц,
            Номенклатура В ИЕРАРХИИ (&Номенклатура)
                И НЕ Контрагент В ИЕРАРХИИ (&СобственныеКонтрагенты)) КАК ПродажиОбороты
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ПродажиОбороты.Период КАК Период,
    ПродажиОбороты.Подразделение КАК Подразделение,
    ЕСТЬNULL(ПродажиОбороты.КоличествоОборот, 0) КАК КоличествоОборот,
    ЕСТЬNULL(ПродажиОбороты.СтоимостьОборот, 0) КАК СтоимостьОборот,
    тТовары.Номенклатура
ИЗ
    тТовары КАК тТовары
        ЛЕВОЕ СОЕДИНЕНИЕ тПродажи КАК ПродажиОбороты
        ПО тТовары.Номенклатура = ПродажиОбороты.Номенклатура

УПОРЯДОЧИТЬ ПО
    ПродажиОбороты.Номенклатура.Наименование
ИТОГИ
    СУММА(КоличествоОборот),
    СУММА(СтоимостьОборот)
ПО
    Подразделение
12 Галахад
 
гуру
23.12.14
✎
07:33
(11) Для (10)
13 чувак
 
23.12.14
✎
07:34
(11) Пропустил индексирование во временной таблице
14 dmpl
 
23.12.14
✎
07:35
(13) Само проиндексируется как надо.
15 чувак
 
23.12.14
✎
07:36
(14) Первый раз слышу
16 Галахад
 
гуру
23.12.14
✎
07:37
(13) Добавил индекс. Скорость не изменилась.
17 чувак
 
23.12.14
✎
07:38
(16) Тогда некуда дальше оптимизировать :) имхо
18 dmpl
 
23.12.14
✎
07:41
(15) ИНДЕКСИРОВАТЬ ПО навредить гораздо легче, чем помочь. Достаточно указать неправильный порядок индексирования полей - и получишь тормоза. Не укажешь ИНДЕКСИРОВАТЬ ПО или укажешь правильный порядок - получишь одинаковую скорость в большинстве случаев.

(16) Что и требовалось доказать.
19 FireAlex
 
23.12.14
✎
07:41
в параметрах вирт таблицы замени
Номенклатура В ИЕРАРХИИ (&Номенклатура)
на выборку из временной таблицы.
"в иерархии" тяжелая операция.
она у тебя два раза выполняется.
20 DrZombi
 
гуру
23.12.14
✎
07:42
(11) Зачем тебе "Номенклатура В ИЕРАРХИИ (&Номенклатура)"

Если ты уже получаешь все в ВТ "тТовары" :)
21 FireAlex
 
23.12.14
✎
07:42
(16) индекс по какому полю добавил?
22 Галахад
 
гуру
23.12.14
✎
07:43
(19) В реальном запросе так оно и есть. См (0).

"В иерархии" это что бы в консоли проверить.
23 Andrewww123
 
23.12.14
✎
07:49
(0) А какое время выполнения запроса?
24 break
 
23.12.14
✎
07:51
юзай физическую таблицу РегистрНакопления.Продажи
25 Andrewww123
 
23.12.14
✎
07:52
(11) Почему
"УПОРЯДОЧИТЬ ПО
    ПродажиОбороты.Номенклатура.Наименование"
А не "тТовары.Номенклатура.Наименование"? К быстродействию отношения не имеет, но всё же.
26 чувак
 
23.12.14
✎
07:53
(25) Зачем сортировка, если уже он сортирован?
27 Andrewww123
 
23.12.14
✎
07:56
(26) Кто сортирован?
28 ИсчадиеADO
 
23.12.14
✎
07:57
измерения и порядок их у регистра какие?
29 чувак
 
23.12.14
✎
08:00
(27) По моему при соединении по полю Номенклатура это поле сортируется. К тому же если в регистре у реквизита стоит "Индексировать"
30 Skom
 
23.12.14
✎
08:01
(0) за какой период делаешь? долго это сколько?
31 SeraFim
 
23.12.14
✎
08:04
(14) >> Само проиндексируется как надо.
а можно поподробнее? Как оно само по себе проиндексируется? Где почитать?
32 Andrewww123
 
23.12.14
✎
08:07
(29) Да ну, нет такого.
33 чувак
 
23.12.14
✎
08:10
(32) Не знаю как толковать Гилева, но он так и написал:

Поиск, при котором данные считываются в определенном порядке. Если результирующий набор данных должен быть отсортирован в порядке кластеризованного индекса, то сортировка не нужна, поскольку результирующий набор данных уже заранее отсортирован. Например, если кластеризованный индекс создан по колонкам lastname (фамилия), firstname (имя), а для приложения требуется сортировка по фамилии и затем по имени, то здесь нет необходимости добавлять инструкцию ORDER BY.
Правда при всей полезности индексов, есть одно очень важное НО – индекс должен быть «эффективно используемым» и должен позволять  находить данные с использованием меньшего числа операций ввода-вывода и объема системных ресурсов.
34 чувак
 
23.12.14
✎
08:12
В запросах кода конфигурации использование индексов зависит условий, на которые есть смысл обратить внимание:

ВЫБРАТЬ … ИЗ … ГДЕ <условие>
СОЕДИНЕНИЕ … ПО <условие>
ВЫБРАТЬ … ИЗ <ВиртуальнаяТаблица>(, <условие>)
ИМЕЮЩИЕ <условие>
Если в системе нет индекса, который мог бы эффективно использоваться для данного запроса, то необходимо рассмотреть одну из следующих возможностей:

Установить свойство «Индексировать»
Изменить порядок следования измерений в регистре
35 Fragster
 
гуру
23.12.14
✎
08:20
ветку не читал, но в запросе из (0) сортировать надо по наименованию из справочника, а не из регистра
36 Andrewww123
 
23.12.14
✎
08:20
(33) Может быть, это работает если выбирать данные из одной таблицы регистра накопления? Но в нашем примере же соединение. Если предположить что в таблице "тПродажи" пусто, то как результирующий набор данных отсортируется?
37 Fragster
 
гуру
23.12.14
✎
08:22
(35)+ после этого - возможно вынести виртуальную таблицу во временную + индекс по номенклатуре в ней, а её уже соединять со справочником
38 чувак
 
23.12.14
✎
08:25
(36) Начнем с того что виртуальная таблица уже отсортирована. Или не согласен?
39 Лефмихалыч
 
23.12.14
✎
08:28
(0) явных косяков нет, так что без плана запроса - это гадание на кофейной гуще
40 ам794123
 
23.12.14
✎
08:28
Когда я вижу в запросе такие конструкции:
ПродажиОбороты.Номенклатура.Наименование
меня прям колбасит.
41 Andrewww123
 
23.12.14
✎
08:29
(38) Допустим. Но выбираешь строки ты из таблицы "тТовары", которая не отсортирована. А к ней присоединяешь отсортированную виртуальную таблицу. В честь чего в первой таблице изменится порядок строк? :)
42 Лефмихалыч
 
23.12.14
✎
08:32
(40) существенно не повлияет даже, если убрать совсем сортировку
43 ам794123
 
23.12.14
✎
08:32
(42) да ладно?
44 Лефмихалыч
 
23.12.14
✎
08:35
(43) наименование - это индекс. Ну, давай у автора спросим, чтобы не гадать.
АААВТООООР! Пробовал сортировку выкосить?
45 Матиус
 
23.12.14
✎
08:36
ВЫБРАТЬ БЫСТРО
  ПродажиОбороты.Период КАК Период,
...
46 чувак
 
23.12.14
✎
08:37
(41) Ладно. У меня ща после соединения результат получился отсортированным без оператора сортировки
47 Euguln
 
23.12.14
✎
08:38
Можно местами поменять :
Подразделение В (&Подразделение)
                    И Номенклатура В (&Номенклатура)
48 чувак
 
23.12.14
✎
08:39
(47) А может в регистре они так и расположены?
49 Euguln
 
23.12.14
✎
08:40
(48) Значит регистр тупой
50 unregistered
 
23.12.14
✎
08:44
(47) >> Можно местами поменять

Тогда уж лучше так:

(Подразделение, Номенклатура) В (ВЫБРАТЬ РАЗЛИЧНЫЕ &Подразделение КАК Подразделение, ВременнаяТаблицаНоменклатуры.Номенклатура КАК Номенклатура ИЗ ВременнаяТаблицаНоменклатуры КАК ВременнаяТаблицаНоменклатуры)
51 Матиус
 
23.12.14
✎
08:47
Вот людям заняться нечем
52 Skom
 
23.12.14
✎
08:48
(0) еще раз, в чем вопрос стоит? долго это сколько? запрос выполняется не 3 секунды, а 15-20? для отчета это не существенно.

Стоит ли решение задачи потраченного времени?
Потому как сам запрос, как уже сказал (39), вполне правильно составлен.
53 dk
 
23.12.14
✎
08:49
без упорядочить и итоги скока формируется?
54 dmpl
 
23.12.14
✎
08:51
(31) Это опыт. Добавление ИНДЕКСИРОВАТЬ ПО чаще всего ничего не меняет (если грамотно добавлять), иногда ухудшает скорость до нескольких раз (если ошибся с индексами). Улучшения тоже бывают, но весьма редко - когда оптимизатор не справляется.
55 чувак
 
23.12.14
✎
08:53
(54) т.е. Гилев не прав? Вот его мнение:

"Обратите внимание на то, что для оптимизации работы запроса почти всегда необходимо проиндексировать создаваемую временную таблицу. Индекс должен быть подобран таким образом, чтобы СУБД могла его использовать при соединении с временной таблицей. То есть, в индексе должны быть перечислены все поля, которые используются в условии соединения."
56 dk
 
23.12.14
✎
08:58
имхо индексы отлично отрабатывают на таблицах с тысячами записей
а если в таблице до 100 элементов, то может и медленнее получится
57 SeraFim
 
23.12.14
✎
08:59
(54) имхо, просто объемы не те, чтобы увидеть разницу
58 чувак
 
23.12.14
✎
09:00
(56) Ну раз автор решил постит эту ветку походу у него дохренище записей.
59 StaticUnsafe
 
23.12.14
✎
09:07
ВЫБРАТЬ ПОБЫСТРЕЕ
60 SeraFim
 
23.12.14
✎
09:13
(59) волшебное слово забыл
61 AlexITGround
 
23.12.14
✎
09:23
(52) (56) Вот они правильные ответы.
"Оптимизировать код можно бесконечно, надо знать когда остановиться" (с) я не помню чьи слова, сорри
62 НЕА123
 
23.12.14
✎
09:35
(0)
заменить ГДЕ на И
.....
        ПО (ПродажиОбороты.Номенклатура = Ном.Ссылка)
ГДЕ
    Ном.Ссылка В(&Номенклатура)



        ПО (ПродажиОбороты.Номенклатура = Ном.Ссылка) И
    Ном.Ссылка В(&Номенклатура)
63 dmpl
 
23.12.14
✎
09:43
(55) Вопрос в том, когда он это писал (для какой версии платформы). Плюс в некоторых сложных случаях прямое указание индексов может быть необходимо, но таких случаев немного.

А вот если сделать ИНДЕКСИРОВАТЬ ПО Организация, Подразделение, а потом используешь поля не в том порядке (типа, Подразделение = Подразделение И Организация = Организация) - то можно словить тормоза из-за того что индекс построить автоматом ты не дал, а сам указал тот индекс, который использовать не получится.

(57) 200 Гб база с сотнями тысяч-миллионами записей пойдет? Когда при неправильном указании индекса время выполнения запроса 20-30 секунд, а при правильном - около 1-2 секунд? Статистически разница между правильным индексированием и неуказанным индексом меньше 5% в большинстве случаев.

(62) Вылезет вся номенклатура.
64 чувак
 
23.12.14
✎
09:47
(63) Ну тогда начерти бедному автору окончательный оптимальный запрос. И тему закроем
65 H A D G E H O G s
 
23.12.14
✎
09:50
А вот если сделать ИНДЕКСИРОВАТЬ ПО Организация, Подразделение, а потом используешь поля не в том порядке (типа, Подразделение = Подразделение И Организация = Организация) - то можно словить тормоза из-за того что индекс построить автоматом ты не дал, а сам указал тот индекс, который использовать не получится.

Адская глупость
66 dmpl
 
23.12.14
✎
09:53
(65) Я тоже так думал, пока не столкнулся с тем, что запрос по 30 секунд выполнялся. Меняешь порядок условий через И, или порядок полей в ИНДЕКСИРОВАТЬ ПО - и все летает. Убираешь ИНДЕКСИРОВАТЬ ПО - тоже все летает, все зависимости от порядка условий.
67 ViSo76
 
23.12.14
✎
09:59
Попробуй так:

ВЫБРАТЬ
    ЕСТЬNULL( тзПродажи.Период, &Date1 ) КАК Период,
    СпрНоменклатура.Ссылка КАК Номенклатура,
    ЕСТЬNULL( тзПродажи.КоличествоОборот, 0 ) КАК КоличествоОборот,
    ЕСТЬNULL( тзПродажи.СтоимостьОборот, 0 ) КАК СтоимостьОборот
ИЗ
    Справочник.Номенклатура КАК СпрНоменклатура

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

    СГРУППИРОВАТЬ ПО
        Номенклатура,
        НАЧАЛОПЕРИОДА( Период, Месяц ),
        Подразделение

    ) КАК тзПродажи
        ПО тзПродажи.Номенклатура = СпрНоменклатура.Ссылка
ГДЕ
    СпрНоменклатура.Ссылка В ( &Номенклатура )

УПОРЯДОЧИТЬ ПО
    СпрНоменклатура.Наименование

ИТОГИ
    СУММА( тзПродажи.КоличествоОборот ),
    СУММА( тзПродажи.СтоимостьОборот )
ПО
    СпрНоменклатура.Ссылка,
    тзПродажи.Подразделение

PS: Конфы как у тебя нет, проверить запрос не могу:
68 AlexITGround
 
23.12.14
✎
10:05
(67) Если таблицы толстые, то срочно "СпрНоменклатура.Ссылка В ( &Номенклатура )" заменить на внутреннее соединение!
69 ViSo76
 
23.12.14
✎
10:20
(68) Думаю что это не поможет.
Так как во первых в начале идёт использование индекса периода, а уже потом идёт использование индекса связанного с номенклатурой.
Во вторых внутренним результирующий запрос будет уменьшен, что явно не в планах автора, как я понял ему нужна вся номенклатура из списка.

Изменённый запрос выглядит примерно так, но я не думаю что он будет быстрее:

ВЫБРАТЬ
    НАЧАЛОПЕРИОДА( ЕСТЬNULL( тзПродажи.Период, &Date1 ), Месяц ) КАК Период,
    СпрНоменклатура.Ссылка КАК Номенклатура,
    ЕСТЬNULL( тзПродажи.Количество, 0 ) КАК КоличествоОборот,
    ЕСТЬNULL( тзПродажи.Стоимость, 0 ) КАК СтоимостьОборот
ИЗ
    Справочник.Номенклатура КАК СпрНоменклатура

    ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи  КАК тзПродажи
        ПО тзПродажи.Период МЕЖДУ &Date1 И &Date2
         И тзПродажи.Номенклатура = СпрНоменклатура.Ссылка
         И тзПродажи.Подразделение В ( &Подразделение )
ГДЕ
    СпрНоменклатура.Ссылка В ( &Номенклатура )

СГРУППИРОВАТЬ ПО
    СпрНоменклатура.Ссылка,
    НАЧАЛОПЕРИОДА( ЕСТЬNULL( тзПродажи.Период, &Date1 ), Месяц ),
    тзПродажи.Подразделение

УПОРЯДОЧИТЬ ПО
    СпрНоменклатура.Наименование

ИТОГИ
    СУММА( тзПродажи.КоличествоОборот ),
    СУММА( тзПродажи.СтоимостьОборот )
ПО
    СпрНоменклатура.Ссылка,
    тзПродажи.Подразделение
70 НЕА123
 
23.12.14
✎
10:24
почему условие
СпрНоменклатура.Ссылка В ( &Номенклатура )
суете в ГДЕ, а не ПО?


ЗЫ
не понимаю, честно.
71 eklmn
 
гуру
23.12.14
✎
10:26
"НУ ПОЖАЛУЙСТА" в конце запроса забыли
72 ViSo76
 
23.12.14
✎
10:26
До соединения идёт фильтрация номенклатуры ( СпрНоменклатура ), далее происходит соединение с регистром накопления ( тзПродажи ), в начале большую таблицу отсекает по периоду, ну а далее уже идёт урезание до нужных номенклатур в строке

И тзПродажи.Номенклатура = СпрНоменклатура.Ссылка
73 Любопытная
 
23.12.14
✎
10:28
(72) "До соединения идёт фильтрация номенклатуры ( СпрНоменклатура )" - это где?
74 ViSo76
 
23.12.14
✎
10:29
ИЗ
    Справочник.Номенклатура КАК СпрНоменклатура

ГДЕ
    СпрНоменклатура.Ссылка В ( &Номенклатура )

Это отрабатывает первым оптимизатором запроса

далее идёт соединение
75 Любопытная
 
23.12.14
✎
10:30
Это для меня что-то новенькое. Всегда была уверена, что условия накладываются на результирующую таблицу, т.е. после соединения
76 ViSo76
 
23.12.14
✎
10:34
Проверьте скорость выполнения двух моих запросов на ( холодных данных )

да в первом запросе нужно подправить на:

ЕСТЬNULL( тзПродажи.Период, НАЧАЛОПЕРИОДА( &Date1, Месяц ) ) КАК Период,

вместо:

ЕСТЬNULL( тзПродажи.Период, &Date1 ) КАК Период,
77 ViSo76
 
23.12.14
✎
10:38
Если можно урезать главную таблицу до соединения, то оптимизатор, я думаю, это сделает, во всяком случае для MSSQL это так, для файловой я думаю что это примерно так же
78 Любопытная
 
23.12.14
✎
10:40
(77) Вот здесь для тех, кто блондинки - кто такой оптимизатор? :)
79 ViSo76
 
23.12.14
✎
10:45
В начале запрос парсится, то есть переводится с текста в инструкции что нужно делать, далее включается как я его называю оптимизатор, который строит план выполнения запроса, т.е. в какой последовательности исполнять команды, чтобы выборка данных бала максимально быстрой ( если вкратце )
80 НЕА123
 
23.12.14
✎
10:48
(79)
проверил бы, для начала.
(78)+1
81 ViSo76
 
23.12.14
✎
10:50
(80) Нет конфы предлагаю проверить самим, я и так уже в рот положил, а челюстями поработайте пожалуйста сами.
82 Любопытная
 
23.12.14
✎
10:50
(79) Ну вот у меня есть консоль запросов, в которой я могу посмотреть анализ вложенных запросов - все таблицы, которые выбираются.
У меня торговли нет под рукой, так что я буду сотрудниками оперировать:
ВЫБРАТЬ
    СотрудникиОрганизаций.Ссылка,
    РабочееВремяРаботниковОрганизацийОбороты.ДнейОборот,
    РабочееВремяРаботниковОрганизацийОбороты.ЧасовОборот,
    РабочееВремяРаботниковОрганизацийОбороты.Организация
ИЗ
    Справочник.СотрудникиОрганизаций КАК СотрудникиОрганизаций
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.РабочееВремяРаботниковОрганизаций.Обороты(
                &НачалоПериода,
                &КонецПериода,
                Период,
                Сотрудник В
                    (&МассивСотрудников)) КАК РабочееВремяРаботниковОрганизацийОбороты
        ПО РабочееВремяРаботниковОрганизацийОбороты.Сотрудник = СотрудникиОрганизаций.Ссылка
ГДЕ
    СотрудникиОрганизаций.Ссылка В(&МассивСотрудников)

И вот такой вариант:
ВЫБРАТЬ
    СотрудникиОрганизаций.Ссылка
ПОМЕСТИТЬ ВТ_Сотрудники
ИЗ
    Справочник.СотрудникиОрганизаций КАК СотрудникиОрганизаций
ГДЕ
    СотрудникиОрганизаций.Ссылка В(&МассивСотрудников)
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ_Сотрудники.Ссылка,
    РабочееВремяРаботниковОрганизацийОбороты.Организация,
    РабочееВремяРаботниковОрганизацийОбороты.ДнейОборот
ИЗ
    ВТ_Сотрудники КАК ВТ_Сотрудники
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.РабочееВремяРаботниковОрганизаций.Обороты(&НачалоПериода, &КонецПериода, Период, Сотрудник В (&МассивСотрудников)) КАК РабочееВремяРаботниковОрганизацийОбороты
        ПО ВТ_Сотрудники.Ссылка = РабочееВремяРаботниковОрганизацийОбороты.Сотрудник
83 Любопытная
 
23.12.14
✎
10:52
+(82) В первом варианте таблица СотрудникиОрганизаций тупо тащит ВООБЩЕ ВСЕ записи из справочника, а во втором ВТ_Сотрудники имеет уже только то, что отобрано условием
84 Любопытная
 
23.12.14
✎
10:53
База у меня файловая естественно. Но вывод для меня совершенно однозначный: условия в запросах отрабатывают ПОСЛЕ соединения таблиц
85 НЕА123
 
23.12.14
✎
10:54
(84)
в скуле то же самое.
чудес не бывает.(с)
86 Бубка Гоп
 
23.12.14
✎
10:54
(84) а как же Великий Оптимизатор? он за нас не подумал и не отсек при объединении ненужные строки сотрудников?
87 Бубка Гоп
 
23.12.14
✎
10:55
а, у вас левое, тогда не отсек, не заметил =)
88 Любопытная
 
23.12.14
✎
10:56
(86) не знаю, не могу посмотреть таблица после соединения, но до условия.
(87) так в (0) тоже левое, в том и соль, что ему весь справочник нужен
89 Бубка Гоп
 
23.12.14
✎
11:01
(88)
так вместо накладывания условия после объединения
ГДЕ
    Ном.Ссылка В(&Номенклатура)

не проще ли использовать внутреннее соединение, например, убрав тем самым лишнее условие?
90 Любопытная
 
23.12.14
✎
11:02
(89) Эммм... человеку нужно, чтобы номенклатура вывелась даже если движений не было. Вероятно поэтому левое, а не внутреннее
91 Бубка Гоп
 
23.12.14
✎
11:03
ему весь справочник нужен

и

ГДЕ
    Ном.Ссылка В(&Номенклатура)

никак не могу согласовать в голове две эти вещи
92 krbIso
 
23.12.14
✎
11:03
хорошо вбросил
а нужно ли его торопить?
93 Любопытная
 
23.12.14
✎
11:03
(91) ну елки. Не весь справочник, а весь массив номенклатуры. Не придирайтесь к словам
94 ViSo76
 
23.12.14
✎
11:04
(89) Нахрена тогда вообще с номенклатурой соединять если нужно тупо то что в обороте уменьшенное на список, а не полный список?
95 AlexITGround
 
23.12.14
✎
11:04
(90) Мадам, если пишется конструкция В (&Номенклатура), то это ничто иное как внутреннее соединение.
96 НЕА123
 
23.12.14
✎
11:05
(89)
может и так. автор знает.
97 Бубка Гоп
 
23.12.14
✎
11:06
(94) +
Вот мы и приходим потихоньку к решению проблемы автора
98 Любопытная
 
23.12.14
✎
11:07
(95) А если эта конструкция левым соединением к справочнику цепляется?
99 НЕА123
 
23.12.14
✎
11:07
(95)
скорее всего, да.
но не всегда.
может оказаться, что в &Номенклатура присутствуют ссылки,
которых нет в справочнике (удалены).
100 Любопытная
 
23.12.14
✎
11:07
(94) Нужно всю нужную номенклатуру вне зависимости от наличия/отсутствия оборотов по ней.
Вы чего? Уже отдыхаете?
101 Крошка Ру
 
23.12.14
✎
11:08
(95) Оригинальная трактовка внутреннего соединения.

(94) А с номенклатурой соединять, видимо потому, что по списку нужны все обороты, в т.ч. нулевые, а в оборотах их нет.
102 Любопытная
 
23.12.14
✎
11:08
И вообще, чего я распинаюсь? Накинулись, блин. Грузите мозг ТСу, это его проблемы
103 Бубка Гоп
 
23.12.14
✎
11:08
а если тс все же угодно выбирать !весь мать его огромный справочник номенклатура! тогда ускорить данный запрос мы сможем на жалкие доли процента, чтобы мы тут не нафантазировали
104 НЕА123
 
23.12.14
✎
11:09
(100)+1
(99) сторно.
105 Крошка Ру
 
23.12.14
✎
11:09
(99)>>может оказаться, что в &Номенклатура присутствуют ссылки,
которых нет в справочнике (удалены).

Случайно забрели из другой базы?
106 Крошка Ру
 
23.12.14
✎
11:10
(103) Ну вот, первая здравая мысль за всю ветку.
107 Бубка Гоп
 
23.12.14
✎
11:10
(100) Вот, мы уже начали ванговать что собственно ТС хотел получить данным запросом =)
108 ViSo76
 
23.12.14
✎
11:10
(100) Нет я то как раз в курсе что нужно и 2 моих запроса говорят об этом
109 НЕА123
 
23.12.14
✎
11:11
(105)
удалили программно.
ну, может движения и "Случайно забрели из другой базы".
110 Любопытная
 
23.12.14
✎
11:11
(108) Да, мы с вами обсуждали лишь последовательность действий :)
111 AlexITGround
 
23.12.14
✎
11:11
(98) Не имеет значения, просто подумайте, что значит "В()". (99) Не будем на столько извращаться :)
112 ViSo76
 
23.12.14
✎
11:13
(89) По поводу ГДЕ в запросе с фильтрацией номенклатуры. Кто нибудь может привести план исполнения запроса в MS SQL чтобы явно показать что номенклатура фильтруется после соединения а не до
113 AlexITGround
 
23.12.14
✎
11:14
(106) Не первая :) см 52, 56, 61
114 IШаман
 
23.12.14
✎
11:15
(111) Я прям замер во внимании, про левое соедение я уже узнал много нового осталось получить альтернативное знание по оператору В
115 Жан Пердежон
 
23.12.14
✎
11:15
(0) стандартные советы испробовал: вирт. таблицу поместить во временную с индексом, убрать использование реквизитов через точку (в сортировке) и т.д.?

странно, что еще никто про агрегаты не вспомнил
116 чувак
 
23.12.14
✎
11:16
(112) в методичках юзай, найдешь
117 Любопытная
 
23.12.14
✎
11:16
(111) ЧЕго вы ко мне прицепились?
118 AlexITGround
 
23.12.14
✎
11:17
(114) Я не сказал, что оператор В и внутреннее соединение - это одно и тоже, я порекомендовал заменить В на Внутр. соединение, т.к. на больших таблицах это действительно даст ощутимый прирост в производительности. В 95 посте я этого не расписал, сорри, но я думал и так понятно, что это разные вещи.
119 H A D G E H O G s
 
23.12.14
✎
11:19
83% времени выполнения уходит на поиск по кластерному индексу по таблице оборотов. Вы жжете ребятушки, что до сих пор профайлер не запустили.

Ускорить практически нереально, единственная сложность - в остаточный предикат поиска почему то попала номенклатура и подразделение, а не только подразделение.
120 Ksandr
 
23.12.14
✎
11:21
Время выполнения в секундах уже озвучивали?
122 H A D G E H O G s
 
23.12.14
✎
11:22
Вот эта строчка

|--Clustered Index Seek(OBJECT:([testbase].[dbo].[_AccumRgTn19349].[_Accum19349_ByDims_TRRRRRRRRRN] AS [T3]), SEEK:([T3].[_Period] > [Expr1047] AND [T3].[_Period] < [Expr1048]),  WHERE:([testbase].[dbo].[_AccumRgTn19349].[_Fld19329RRef] as [T3].[_Fld19329RRef]=[@P3] AND [testbase].[dbo].[_AccumRgTn19349].[_Fld19334RRef] as [T3].[_Fld19334RRef]=[@P4]) ORDERED FORWARD)

Непонятно вот это:

WHERE:([testbase].[dbo].[_AccumRgTn19349].[_Fld19329RRef] as [T3].[_Fld19329RRef]=[@P3]

Ибо Номенклатура идет сразу за периодом в кластерном индексе.
123 Бубка Гоп
 
23.12.14
✎
11:28
(115)
так вроде это уже предлагали, не?
124 ViSo76
 
23.12.14
✎
11:32
(123) начнём с того что виртуальных таблиц обороты нет и они вычисляются, в моём запросе обращений в базу 1 шт. это уже немного увеличивает скорость, далее у автора непонятно какой построится запрос в результате этого:

УПОРЯДОЧИТЬ ПО
    ПродажиОбороты.Номенклатура.Наименование

и т.д.
125 Fragster
 
гуру
23.12.14
✎
11:35
а про добавить агрегаты с нужными измерениями и периодичностью кто-нибудь вспомнил? кто-нибудь ими вообще пользуется? ;)
126 Жан Пердежон
 
23.12.14
✎
11:36
(125) да, ты немного опоздал; теперь ждем ТС
127 чувак
 
23.12.14
✎
11:37
(125) в уже работающей базе накрутить агрегаты разве кошерно?
128 ViSo76
 
23.12.14
✎
11:38
(122) Ты можешь план исполнения моих двух запросов привести?
129 Fragster
 
гуру
23.12.14
✎
11:40
(127) ну там же есть функции типа

РегистрНакопленияМенеджер.<Имя регистра накопления>.ОпределитьОптимальныеАгрегаты (AccumulationRegisterManager.<Имя регистра накопления>.DetermineOptimalAggregates)
РегистрНакопленияМенеджер.<Имя регистра накопления> (AccumulationRegisterManager.<Имя регистра накопления>)
ОпределитьОптимальныеАгрегаты (DetermineOptimalAggregates)
Синтаксис:

ОпределитьОптимальныеАгрегаты(<МаксимальныйОтносительныйРазмер>)
Параметры:

<МаксимальныйОтносительныйРазмер> (необязательный)

Тип: Число.
Максимальная сумма размеров агрегатов в % от таблицы движений.
Если не указан или равен нулю, то не накладывается ограничений на размер агрегатов.
Значение по умолчанию: 0
Возвращаемое значение:

Тип: ИнформацияОбАгрегатах.

Описание:

Выполняет построение оптимальных агрегатов.

Доступность:

Сервер, толстый клиент, внешнее соединение.
Ошибка? Это не ошибка, это системная функция.