Имя: Пароль:
1C
1С v8
Файловая база (оптимизатор), внутреннее соединение в дин. списке
,
0 Cyberhawk
 
28.06.15
13:10
Друзья!
Имеем УФ, дин. список с основной таблицей (вида "Документ") и произвольный запросом.
В запросе добавляю в поля статус документа через соединене с регистром сведений.
Документов в базе около 10 000, записей в регистре - около 100 000.
Вопрос: почему в файловом варианте при внутреннем соединении дин. список при каждом считывании данных обновляется ~60 секунд, в то время как при левом соединеии - 2-3 секунды? Сами запросы этого дин. списка выполняются ~0.5 секунды (с левым - быстрее на 100 миллисекунд).
Судя по тому, что в клиент-серверном режиме той же базы разницы между левым и внутренним соединением нет (дин. список обновляется за пол-секунды), делаю вывод, что оптимизатор файловой базы как-то не так трактует внутреннее соединение, либо файловый вариант по какой-то еще причине тормозит с выводом дин. списка.
Текст запроса примитивный:
ВЫБРАТЬ РАЗРЕШЕННЫЕ
    ДокументПриемТехники.Ссылка КАК Ссылка,
    СтатусыДокументов.СтатусДокумента КАК СтатусДокумента
ИЗ
    Документ.ПриемТехники КАК ДокументПриемТехники
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПР_СтатусыАктовПриемаВРемонт.СрезПоследних(, ) КАК СтатусыДокументов
        ПО (СтатусыДокументов.Документ = ДокументПриемТехники.Ссылка)
1 vde69
 
28.06.15
13:26
динамический список дерево?
2 Cyberhawk
 
28.06.15
13:56
(1) видел твою тему v8: очень медленно работает динамический список
Нет, не дерево - плоский список (много гуглил и мистил перед тем, как создать тему).
3 vde69
 
28.06.15
14:07
попробуй так

ВЫБРАТЬ РАЗРЕШЕННЫЕ
    ДокументПриемТехники.Ссылка КАК Ссылка,
    СтатусыДокументов.СтатусДокумента КАК СтатусДокумента
ИЗ
    Документ.ПриемТехники КАК ДокументПриемТехники
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПР_СтатусыАктовПриемаВРемонт.СрезПоследних(, ) КАК СтатусыДокументов
        ПО (выразить(СтатусыДокументов.Документ,документссылка.ПриемТехники ) = ДокументПриемТехники.Ссылка)


а вообще проблема в слове "разрешеные"... релься в файловой версии работает отвратительно, в клиент сервере запрос выполняется в ХП а в файловой на клиенте...
4 Cyberhawk
 
28.06.15
20:42
Проверл мини-расследование по предложениям-предположениям из (3)
1. На пользователе с полными правами дин. список тоже тормозит (он тормозит у всех пользователей).
2. Без "РАЗРЕШЕННЫЕ" тоже тормозит у всех пользователей, включая ПолныеПрава.
3. У ролей тех пользователей, под которыми проверял, RLS'ов нет.
4. С использованием ВЫРАЗИТЬ для измерения регистра статусов тоже тормозит (пардон, что вначале сразу не упомянул, что в этом регистре тип измерения не составной - там только одна ссылка на ПриемТехники) у всех пользователей.

А теперь интересная подробность:
1. Замена внутреннего соединения на левое, как писал в (0), сразу помогает.
2. Без замены внутреннего на левое тоже можно обойтись: нужно переставить внутреннее соединение в конец (!!!) секции "ИЗ". Т.е. у меня там идут еще левые соединения с другими регистрами сведений, а в самом конце - внутреннее по статусу. И так тоже дин. список работает быстро!

Из пункта 2 делаю вывод, что все-таки причина в оптимизаторе запросов файлового варианта. Раньше никогда бы не подумал, что порядок связей (соединений) в тексте запроса может играть роль.
5 H A D G E H O G s
 
28.06.15
21:04
(4) Ты потыкал в муравейник рукой, тебя обожгло и ты решил, что там живет огонь.
6 Cyberhawk
 
28.06.15
21:19
(5) а как еще можно объяснить тормоза при внутреннем соединении, идущем перед левыми (и отсутствие тормозов, если все соединения левые, либо если внутренние соединения идут после левых)?
7 H A D G E H O G s
 
28.06.15
21:30
(6) Объяснить можно переведя базу в sql и посмотря план запроса.
8 Cyberhawk
 
28.06.15
21:33
(7) переводил, тормозов не наблюдается вообще ни с внутренним, ни с левым соединением, независимо от их расположения в тексте запроса. Т.е. тормозит только в файловом варианте.
9 H A D G E H O G s
 
28.06.15
21:34
(8) Тормоза могут быть не видны вооруженным взглядом на sql.
Смотри планы запроса, файловая работает идентично ms sql.
10 hhhh
 
28.06.15
22:28
(8) что-то вы не то курите. И ежу понятно, что при левом соединении тупо выводится весь список документов, поэтому всё быстро. А внутреннее соединение - это жесточайший отбор, может у вас в список попадает всего 200 документов из 10000. И так как там всё без индексов, чтобы собрать 2 документов на экране надо перелопатить половину базы.
11 Cyberhawk
 
29.06.15
08:39
(9) ок, спс, возможно посмотрю.
(10) "И так как там всё без индексов" // там - это где?
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.