Имя: Пароль:
1C
1С v8
В ИЕРАРХИИ в виртуальных таблицах
,
0 Бешеная Нога
 
03.12.13
11:46
при подготовке к эксперту нашел "материал", что "В ИЕРАРХИИ" в виртуальных таблицах - зло. ибо тот запрос который формируется для выполнения условия "В ИЕРАРХИИ" ни разу не оптимальный.
и вроде как правильно сначала получить таблицу элементов из иерархии, а уже потом ее использовать в качестве отбора.

есть запросы

ИЗ
    |    РегистрБухгалтерии.Хозрасчетный.Остатки(&ТекущийПериод, Счет В ИЕРАРХИИ (&Счета), , Организация = &Организация)

и

|ИЗ
    |    РегистрБухгалтерии.Хозрасчетный.Остатки(
    |            &ТекущийПериод,
    |            Счет В
    |                (ВЫБРАТЬ
    |                    ТаблицаСчетов.Счет
    |                ИЗ
    |                    ТаблицаСчетов КАК ТаблицаСчетов),
    |            ,
    |            Организация = &Организация) КАК БУ_Текущий


где таблица счетов получается предварительно:

    "ВЫБРАТЬ
    |    Хозрасчетный.Ссылка КАК Счет
    |ПОМЕСТИТЬ ТаблицаСчетов
    |ИЗ
    |    ПланСчетов.Хозрасчетный КАК Хозрасчетный
    |ГДЕ
    |    Хозрасчетный.Ссылка В ИЕРАРХИИ(&Счета)
    |
    |ИНДЕКСИРОВАТЬ ПО
    |    Счет
    |;


замер производительности показывает однинаковые 30 секунд выполнения (второй на 0,15 сек быстрее).


значит фигня про "в иерархии"?
1 unregistered
 
03.12.13
11:51
(0) Относительно регистра бухгалтерии - фигня.

Таблица плана счетов в 99,99% случаев достаточно маленькая.

Если бы речь шла об иерархическом справочнике с приличным количеством элементов, то возможно(!) разница была бы более значительной.
2 unregistered
 
03.12.13
11:52
+ к (1) поэксперементируй с условиями на значения субконто, например, Номенклатура или Контрагенты (смотря какой справочник поболе).
3 Sabbath
 
03.12.13
11:53
(0) а ты попробуй на большем объеме данных (в смысле больше элементов внутри группы) и большей вложенности
4 Бешеная Нога
 
03.12.13
11:57
(2) (3) возможно вы и правы. т.е. во втором случае получается "правильный запрос" но выхлопа особо не дает, так как данных относительно мало...
5 unregistered
 
03.12.13
12:01
(4) Запрос правильный и там и там.

Вопрос только в выигрыше (будет ли он?).
На выполнение запроса для отдельного получения таблицы счетов тоже уходит время и накладные расходы на получение результата этого запроса с последующей передачей этого результата обратно на сервер СУБД в качестве параметра основного запроса.

Если уж идти по такому (второму) пути, то может целесообразнее пакет запросов делать, чтобы не гонять данные туда-сюда между серверами СУБД и 1С.
6 hhhh
 
03.12.13
12:09
(4) это же элементарно, Ватсон. Во втором запросе используется кеш от первого запроса.

Попробуйте перезагрузить комп для верности, и потом запустить второй запрос, а за ним первый. И секунды нам выложите.
7 WildSery
 
03.12.13
14:14
(5) Просветите, пожалуйста, пакетный запрос выполняется не на сервере СУБД, а гоняется туда-сюда по частям?
8 Rovan
 
гуру
03.12.13
14:16
(7) нет...на сервере
9 Fragster
 
модератор
03.12.13
14:22
&Счета - это группа счетов-то хоть?
10 Fragster
 
модератор
03.12.13
14:23
а еще лучше - список групп счетов
11 Fragster
 
модератор
03.12.13
14:24
еще есть чит, который иногда срабатывает (не всегда, надо проводить замер на реальных данных):

(Счет, Истина) В
    |                (ВЫБРАТЬ
    |                    ТаблицаСчетов.Счет, Истина
    |                ИЗ
    |                    ТаблицаСчетов КАК ТаблицаСчетов)
12 H A D G E H O G s
 
03.12.13
14:24
(0) Ты - эксперт? Бугага.
13 Бешеная Нога
 
03.12.13
15:06
(10) список групп счетов и счетов )

(11) да точно, ты уже как то про него говорил, тогда реально сработало ))) попробую применить )
14 Бешеная Нога
 
03.12.13
15:06
(12) давай. разбей меня в пух и прах своими знаниями.
15 Бешеная Нога
 
03.12.13
15:08
(12) в какое соединение выльеться в итоге (в иерархии) в виртуальной таблице?
16 Бешеная Нога
 
03.12.13
15:10
выльется
17 John83
 
04.12.13
10:52
(11) а в чем прикол?
18 Бешеная Нога
 
05.12.13
13:46
(11) в данному случае дало прирост 1с секунду ) все равно запросы почти одинакого выполняются...
19 Sammo
 
05.12.13
13:49
В некоторых случаях у меня (несмотря на рекомендации 1с) Где и join отрабатывали быстрее, чем условие на виртуальную таблицу. Но это в РН. По Бухии не готов сказать
20 Sammo
 
05.12.13
13:50
(17) В скуле получается не in(), а exists(), а он работает шустрее
21 Бешеная Нога
 
05.12.13
13:52
сейчас тесты.
22 Бешеная Нога
 
05.12.13
13:53
запрос в иерархии по регистру бухгалтерии - 47сек
запрос в (таблица, с доп полем истина) по регистру бухгалтерии - 46 секунд
запрос без условия по регистру бухгалтерии - 36 секунд
23 Fragster
 
модератор
05.12.13
14:01
(22) еще сделай тест - 1 запрос - выгрузка счетов в массив, 2 - отбор по параметру-массиву
24 Бешеная Нога
 
05.12.13
14:02
(23) т.е. в параметр виртуальной таблицы сунуть В (&Массив)?
25 mikecool
 
05.12.13
14:03
(20) фигассе... вот это писатели движка )))
26 Бешеная Нога
 
05.12.13
14:22
хотя при любом раскладе выигрыш будет максимум 10 секунд из 47... так что...
27 samozvanec
 
05.12.13
15:14
(26) так то четверть...
28 WildSery
 
05.12.13
15:39
(19) left join никак не может быстрее отрабатывать, чем exists.
29 WildSery
 
05.12.13
15:40
Тьфу, наоборот.
30 H A D G E H O G s
 
05.12.13
15:46
1) Выбрать 1 запросом все счета из иерархии, если так нетерпиться.
2) Обойти кодом счета, получить всевозможные типы субконто.
3) Захерачить в 1 массив счета, в 2 массив - субконто.
4) Запросить остатки.


Другой вопрос, если счетов 100500, тут так делать не надо.