Имя: Пароль:
1C
1С v8
v8: Оптимизация RLS
0 Demetres
 
21.03.14
09:33
Всем добрый день!!!
Подскажите как можно оптимизировать работу RLS? Есть динамический список с более чем 10000 записей. У пользователя стоит RLS на чтение такого типа «ГДЕ Ссылка В(&ДоступныеГруппыДоступаРесурсов)».  ДоступныеГруппыДоступаРесурсов это параметр сеанса который заполняется при запуске базы, данные получаются запросом, не сильно большим, но требующим использование виртуальных таблиц.
От пользователей поступила жалоба на медленную работу списка и нужно что-то  сделать, от RLS отказаться нельзя :( У кого-нибудь есть идеи как оптимизировать RLS, если да то поделитесь пожалуйста
1 mikecool
 
21.03.14
09:35
>>ДоступныеГруппыДоступаРесурсов это параметр сеанса который заполняется при запуске базы, данные получаются запросом, не сильно большим, но требующим использование виртуальных таблиц.

это не влияет на дин. список
2 Ненавижу 1С
 
гуру
21.03.14
09:39
ДоступныеГруппыДоступаРесурсов насколько много там значений?
3 Demetres
 
21.03.14
09:40
(1) я понимаю, просто описал ситуацию, и чтобы было понятно что нельзя перейти на RLS типа ГДЕ Ссылка В(#ДоступныеГруппыДоступаРесурсов) т.к. необходимы вирт. таблицы
4 Fragster
 
гуру
21.03.14
09:41
"в" или "в иерархии"?
5 Demetres
 
21.03.14
09:41
(2) Зависит от пользователя, но в самом плохом случае ~ 10000
6 Demetres
 
21.03.14
09:42
(4) Для вычисления параметра используются "в иерархии"
7 ptiz
 
21.03.14
09:43
Попробовать заменить В(...)  на соединение с регистром сведений, куда и писать доступные значения вместо параметров сеанса.
8 Demetres
 
21.03.14
09:49
(7) РС сведений добавлять не очень хочется, потому что RLS не для всех пользователей. У некоторых пользователей есть просто права на чтение без RLS.
9 х86
 
21.03.14
09:53
(0)смотри какой запрос исполняется СКЛом, думай
10 kiruha
 
21.03.14
09:53
(0)
Нужно понимать , как работает динамический список -
он выбирает данные по индексу, в основном - по коду или наименованию для справочников.
Соответственно вместо ДоступныеГруппыДоступаРесурсов
ДоступныеГруппыДоступаРесурсовКод - те же ссылки ввиде кода
условие
«ГДЕ Код В(&ДоступныеГруппыДоступаРесурсовКод)»
И сортировка только по коду
11 Demetres
 
21.03.14
09:56
(10) Код не всегда уникальный, а ссылка это аналог УникальногоИдентификатора и он всегда уникален в рамках одного справочника.
Кстати забыл сказать, что это динамический список у справочника.
12 kiruha
 
21.03.14
09:58
(11)
Вы уже сами смотрите чтобы Ваш Rls попал в индекс сортировки
Я только примерно дал
13 erp20
 
21.03.14
09:58
(8) Ты сам конечно смотри, но перед тем как наложить фильтр в запросе по параметру сеанса, имеющему тип значений массив - 1С передает эти данные СУБД, они впоследствии собираются в таблицу операциями constant scan. Трудозатраты растут пропорционально количеству строк из которых таблица формируется. Можно обойтись без промежуточной передачи данных, если их хранить в СУБД, например в регистре сведений с двумя измерениями:

Пользователь / Группа Доступа Ресурсов

в RLS выбирать не из параметра сеанса, а из физической таблицы в БД.
14 Demetres
 
21.03.14
10:02
Получается что быстрее было бы если использовать РС типа (Ресурс: Пользователь; Измерение: Группа Доступа Ресурсов) а РЛС переделать на ГДЕ Ссылка В(#ДоступныеГруппыДоступаРесурсов) ДоступныеГруппыДоступаРесурсов - Это шаблон из этого РС?
15 erp20
 
21.03.14
10:08
(14) Как то так:

ТекущаяТаблица
ИЗ
#ТекущаяТаблица КАК ТекущаяТаблица
ГДЕ
ТекущаяТаблица.Ссылка В
(ВЫБРАТЬ
  ОграничениеДоступа.ГруппаДоступа
  ИЗ
  РегистрСведений.ОграничениеДоступа КАК ОграничениеДоступа
  ГДЕ
  ОграничениеДоступа.Пользователь = &ТекущийПользователь)

В регистре ОграниченияДоступа хранишь списки доступных групп по пользователям.
Пользователь и ГруппаДоступа должны быть измерениями!!Первым идет Пользователь, а потом Группа доступа!! Тогда получишь кластерный индекс, позволяющий мгновенно выбирать все группы доступа пользователя. Без передачи их с сервера 1С на сервер СУБД.

А вообще ты уверен что именно в РЛС проблема?
16 erp20
 
21.03.14
10:14
(15) Да, если у тебя группа доступа, в справочнике который ты фильтруешь по РЛС находится не в реквизите "Ссылка" (это пример) то этот реквизит должен быть проиндексирован.
17 Demetres
 
21.03.14
10:14
(15) Да проблема в РЛС, т.к. если просто право на чтение то все работает ОК.
18 Demetres
 
21.03.14
10:15
Похоже что кроме РС ничего придумать не получиться.
Ребята большое спасибо за советы, вы мне очень помогли!!!
19 kiruha
 
21.03.14
10:17
Есть еще вариант, если данные только из группы доступа - использовать источник для таблицы проиндексированную "группу доступа" типа регистра с левым соединением к уже справочнику.
Т.е. будет динамический список источник - произвольный запрос

Небольшой геморрой с оформлением
20 kiruha
 
21.03.14
10:27
А вообще 10 000 записей в справочнике это вообще не о чем.
Пол сек работы запроса для полной выборки
21 banco
 
21.03.14
10:37
(0) еще вариант, не изобретать велосипед и использовать подсистему Управление доступом из БСП
22 Demetres
 
21.03.14
11:26
Переделал заполнение параметра и изменил RLS
ГДЕ Не (Не (Владелец В (&ДоступныеГруппыДоступаРесурсов)) И Не (Ссылка В(&ДоступныеГруппыДоступаРесурсов)))
Теперь получается в параметре всегда 1-3 значения.

Как вы думаете то что я использую Не (Не [Условие1] И Не [Условие2]) вместо Условие1 Или Условие2 дает какой-то бонус по скорости?
23 Demetres
 
21.03.14
11:29
Если не ошибаюсь в запросах рекомендуют не использовать ИЛИ в ГДЕ потому что это равносильно разбиению на два запрос с ОБЪЕДИНИТЬ ВСЕ
24 Fragster
 
гуру
21.03.14
12:54
(6) проблема именно в этом.

(23) вторая часть наоборот - рекомендуют использовать два запроса с объединить, ибо индексы и вся фигня, которая инкому не интересна
25 Fragster
 
гуру
21.03.14
12:56
нужно регламентно (или при записи или еще как, например обновлять параметр сеанса) переделывать иерархический список в плоский и в шаблонах уже его использовать
Программист всегда исправляет последнюю ошибку.