|
Запросы RLS и быстродействие | ☑ | ||
---|---|---|---|---|
0
Stim
20.11.15
✎
12:17
|
Сильно ли я нагружу систему при открытии справочника договоры, если напишу запрос РЛС примерно такой:
ГДЕ Контрагент.Партнер.ОсновнойМенеджер.ТекущееПодразделение = &ТекущееПодразделение Можно это как-то оптимизировать? |
|||
1
vde69
20.11.15
✎
12:20
|
будет ппц.....
оптимизировать можно так ГДЕ ТекущееПодразделение = &ТекущееПодразделение |
|||
2
Stim
20.11.15
✎
12:22
|
(1) ппц.. вы так говорите, как будто не видели стандартных рлс-запросов
|
|||
3
vde69
20.11.15
✎
12:23
|
точнее так
ГДЕ ПодразделениеДляRLS в (&МассивПодразделений) соответственно нужно добавить и заполнять реквизит ПодразделениеДляRLS а МассивПодразделений должен быть как минимум из двух элементов, пустого и текущего |
|||
4
VikingKosmo
20.11.15
✎
12:23
|
(0) нужно добавить еще выборок через многочисленные точки
|
|||
5
vde69
20.11.15
✎
12:24
|
(2) видел там жопа, но там такого ужаса как в (0) нет....
|
|||
6
Гёдза
20.11.15
✎
12:26
|
а сколько всего контрагентов? Если всего пару тыщ, то особой разницы нет
|
|||
7
Stim
20.11.15
✎
12:26
|
(5) есть еще варианты, тебе в копилку:
ГДЕ Партнер.ОсновнойМенеджер.ТекущееПодразделение В (ВЫБРАТЬ ЗначенияГруппДоступа.ЗначениеДоступа ИЗ РегистрСведений.ЗначенияГруппДоступа КАК ЗначенияГруппДоступа ГДЕ ЗначенияГруппДоступа.ГруппаДоступа В (ВЫБРАТЬ ГруппыДоступаПользователи.Ссылка ИЗ Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи ГДЕ ГруппыДоступаПользователи.Пользователь = &ТекущийПользователь) И ЗначенияГруппДоступа.ВидДоступа = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыДоступа.Подразделения) И НЕ ЗначенияГруппДоступа.ТолькоВидДоступа ) |
|||
8
vde69
20.11.15
✎
14:25
|
(7) тут нет большой ж... вложеный запрос имеет статическое условие и будет закеширован (то есть выполнится 1 раз для каждого пакета рельсы, пакеты зависят от выборки, обычно 20-30 элементов на динамическом списке), а для отчета - вообще только 1 раз выполнится...
единственное - отсутствие индекса но для мелкой таблицы это нормально (а вложенный возвращает мелкую таблицу) конечно можно было джойнить, но там реально можно попасть в фул скан, а тут сделали "понадежнее" твой вариант на порядок хуже.... |
|||
9
Stim
20.11.15
✎
14:27
|
(8) предлагаешь добавить реквизит в справочники, его заполнять везде и по нему проверять? Ради одной роли?
|
|||
10
Гёдза
20.11.15
✎
14:29
|
(9) не проще ли попробовать?
|
|||
11
vde69
20.11.15
✎
14:29
|
(9) если не хочешь реквизит -
то ради одной роли можно сделать регистр сведений в которой прописать "Объект"+"Пользователь" = "Доступ", так в типовых делают... и в рельсе джойн.. только с типизацией в условии не лоханись, используй "выразить" |
|||
12
vde69
20.11.15
✎
14:34
|
вот мой шаблон, сделка - это документ!!! работает хорошо!!!
// ----------------------------------------------------------- // шаблон к торговым документам // Параметры // 1. Имя реквизита Сделка или 0 для доступа по регистру "документы по сделки" // 2. Имя реквизита Склад1 // 3. Имя реквизита Склад2 // 4. Имя реквизита ЦФО // 5. Зарезервировано // 6. Дополнительное ИЛИ условие (например "ЭтоГруппа") // // все параметры могут быть пустыми ТекущаяТаблица ИЗ #ТекущаяТаблица КАК ТекущаяТаблица #Если ("#Параметр(1)" = "0") и &ИспользоватьОграниченияПравДоступаНаУровнеЗаписей #Тогда // основной вид доступа по сделке для документов не имеющих реквизита сделка (реквизит в ТЧ) ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДокументыПоСделке КАК ДокументыПоСделке ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ДоступПоСделкам КАК ДоступПоСделкам ПО (ДоступПоСделкам.Сделка = ДокументыПоСделке.Сделка) ПО (ДокументыПоСделке.Регистратор = ТекущаяТаблица.Ссылка) #ИначеЕсли ("#Параметр(1)" <> "") и &ИспользоватьОграниченияПравДоступаНаУровнеЗаписей #Тогда // основной вид доступа по сделке по реквизиту ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДоступПоСделкам КАК ДоступПоСделкам ПО ТекущаяТаблица.#Параметр(1) = ДоступПоСделкам.Сделка #КонецЕсли ГДЕ (НЕ &ИспользоватьОграниченияПравДоступаНаУровнеЗаписей ИЛИ &ИспользоватьОграниченияПравДоступаНаУровнеЗаписей И ( // основной вид доступа по сделки #Если "#Параметр(1)" <> "" #Тогда (ЕСТЬNULL(ДоступПоСделкам.Пользователь, &ТекущийПользователь) В (&RLS_ДоступныеОтделы)) #Иначе ЛОЖЬ #КонецЕсли // дополнительный вид доступа по складу, перекрывает доступ по сделке #Если "#Параметр(2)" <> "" #Тогда ИЛИ ТекущаяТаблица.#Параметр(2) В (&RLS_ДоступныеСклады) #КонецЕсли #Если "#Параметр(3)" <> "" #Тогда ИЛИ ТекущаяТаблица.#Параметр(3) В (&RLS_ДоступныеСклады) #КонецЕсли // дополнительный вид доступа по документам без доступа по сделкам, но с ЦФО #Если "#Параметр(1)" = "" и "#Параметр(4)" <> "" #Тогда ИЛИ ТекущаяТаблица.#Параметр(4) В (&RLS_ДоступныеЦФО) #КонецЕсли // зарезервированый параметр #Если "#Параметр(5)" <> "" #Тогда #КонецЕсли // текстовое условие #Если "#Параметр(6)" <> "" #Тогда ИЛИ #Параметр(6) #КонецЕсли )) |
|||
13
Stim
20.11.15
✎
14:38
|
(11) офигеть. добавить новый регистр, который заполнять 100500 значениями элементов доступа на каждого пользователя.
|
|||
14
vde69
20.11.15
✎
15:49
|
(13) есть такое понятие для СУБД как "денормализация", в твоем случае она оправдана...
почитай https://ru.wikipedia.org/wiki/Денормализация |
|||
15
Гёдза
20.11.15
✎
16:02
|
кстати так и работает в УПП доступ по контрагентам
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |