|
Оптимизация запроса | ☑ | ||
---|---|---|---|---|
0
Лялечка
21.07.11
✎
12:33
|
Добрый день! Я конечно понимаю, что тема обсуждалась на форуме уже ни раз, но все же.
Использую в конфигурации несколько наборов прав, MS SQL. Ограничен доступ на справочник "Контрагенты". Пользователю назначаю несколько ролей и при открытии справочника вылезает ошибка "слишком много таблиц.возможно 256", в принципе все логично, но права ограничивать как-то надо. Возможно ли оптимизировать данный запрос или нет? Заранее спасибо. ##Если &ИспользоватьОграниченияПравДоступаНаУровнеЗаписей ##Тогда ТекущаяТаблица ИЗ #ТекущаяТаблица КАК ТекущаяТаблица ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ РАЗЛИЧНЫЕ СоставГруппы.Ссылка КАК ГруппаПользователей ИЗ Справочник.ГруппыПользователей.ПользователиГруппы КАК СоставГруппы ГДЕ СоставГруппы.Пользователь = &ТекущийПользователь ИЛИ СоставГруппы.Пользователь.Подразделение.Родитель = &ТекущееПодразделение ИЛИ СоставГруппы.Пользователь.Подразделение.Родитель.Родитель = &ТекущееПодразделение ИЛИ СоставГруппы.Пользователь.Подразделение.Родитель.Родитель.Родитель = &ТекущееПодразделение) КАК ГруппыПользователей ПО (&ИспользоватьОграниченияПравДоступаНаУровнеЗаписей) ГДЕ (&ИспользоватьОграниченияПравДоступаНаУровнеЗаписей = ЛОЖЬ #Параметр(3) ИЛИ (НЕ 1 В (ВЫБРАТЬ ПЕРВЫЕ 1 1 КАК ПолеОтбора ИЗ РегистрСведений.НазначениеВидовОбъектовДоступа КАК НазначениеВидовОбъектовДоступа ГДЕ НазначениеВидовОбъектовДоступа.ГруппаПользователей = ГруппыПользователей.ГруппаПользователей И ВЫБОР КОГДА НазначениеВидовОбъектовДоступа.ВидОбъектаДоступа = ЗНАЧЕНИЕ(Перечисление.ВидыОбъектовДоступа.#Параметр(1)) ТОГДА ВЫБОР КОГДА 1 В (ВЫБРАТЬ ПЕРВЫЕ 1 1 ИЗ РегистрСведений.НастройкиПравДоступаПользователей КАК НастройкиПравДоступаПользователей ГДЕ НастройкиПравДоступаПользователей.ОбъектДоступа = ТекущаяТаблица.#Параметр(2) И НастройкиПравДоступаПользователей.ВидОбъектаДоступа = ЗНАЧЕНИЕ(Перечисление.ВидыОбъектовДоступа.#Параметр(1)) И (НастройкиПравДоступаПользователей.Пользователь = НазначениеВидовОбъектовДоступа.ГруппаПользователей ИЛИ НастройкиПравДоступаПользователей.Пользователь = ЗНАЧЕНИЕ(Справочник.ГруппыПользователей.ВсеПользователи))) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ ИНАЧЕ ИСТИНА КОНЕЦ = ЛОЖЬ) И (1 В (ВЫБРАТЬ 1 КАК КатегорииОбъектов ИЗ РегистрСведений.КатегорииОбъектов КАК КатегорииОбъектов ГДЕ КатегорииОбъектов.Категория.Наименование = "Поставщики" И ТекущаяТаблица.Ссылка = КатегорииОбъектов.Объект.Ссылка))) И НЕ ГруппыПользователей.ГруппаПользователей ЕСТЬ NULL) ##КонецЕсли |
|||
1
Лялечка
22.07.11
✎
10:30
|
Люди, ну неужели никто не поможет?:(
|
|||
2
bar0n0
22.07.11
✎
10:36
|
Скорее всего надо ограничить вот этот тип КатегорииОбъектов.Объект на те виды обектов которые реально используются.
|
|||
3
luckyluke
22.07.11
✎
10:37
|
КатегорииОбъектов.Категория - составной тип?
|
|||
4
luckyluke
22.07.11
✎
10:39
|
а! вот так "И ТекущаяТаблица.Ссылка = КатегорииОбъектов.Объект" попробуй.
|
|||
5
Лялечка
22.07.11
✎
11:57
|
(3)Нет, КатегорииОбъектов.Категория - СправочникСсылка, а вот КатегорииОбъектов.Объект как раз составной
|
|||
6
luckyluke
22.07.11
✎
11:59
|
(5) убери после вот этого "КатегорииОбъектов.Объект" вот это ".Ссылка"
|
|||
7
Лялечка
22.07.11
✎
12:04
|
Убрала, так вроде лучше работает, хотя бы ошибку не выдает:) Спасибо огромное:) только вот интересно, если я еще один набор такой сделаю, то не вылезет ли она снова, надо попробовать. Кроме ссылки этой больше нечего убрать?
|
|||
8
Лялечка
02.08.11
✎
14:59
|
Добрый день! В продолжение темы об этом несчастном запросе. Работает правильно, но очень долго:( Может есть какие-нибудь способы ускорить его работу?
|
|||
9
Axel2009
02.08.11
✎
15:02
|
(8) отказаться?
|
|||
10
Fragster
гуру
02.08.11
✎
15:05
|
ТекущаяТаблица.Ссылка = КатегорииОбъектов.Объект.Ссылка
убрано второе .Ссылка? СоставГруппы.Пользователь или СоставГруппы.Пользователь.Подраздление - составного типа? |
|||
11
Fragster
гуру
02.08.11
✎
15:06
|
да и вообще все эти Или .Родитель не нравятся мне. может лучше В ИЕРАРХИИ (&ТекущееПодразделение)?
|
|||
12
Лялечка
02.08.11
✎
15:08
|
(10) да, получилось ТекущаяТаблица.Ссылка = КатегорииОбъектов.Объект
|
|||
13
Лялечка
02.08.11
✎
15:09
|
(10) нет подразделение не составного типа
|
|||
14
Лялечка
02.08.11
✎
15:14
|
(9) может быть и отказаться, тогда как ограничить права пользователей
|
|||
15
Лялечка
02.08.11
✎
15:19
|
(11) это RLS, по-моему, там нельзя использовать В ИЕРАРХИИ или я ошибаюсь?
|
|||
16
Fragster
гуру
02.08.11
✎
15:23
|
(15) а, ну да. тогда остается пересмотреть раздачу прав :)
попробуй свой запрос в консольке выполнить OFF: а почему @ГосподинПЖ на sql.ru заблокирован? |
|||
17
Лялечка
02.08.11
✎
15:26
|
(16) >>OFF:
а почему @ГосподинПЖ на sql.ru заблокирован? это что? |
|||
18
Лялечка
02.08.11
✎
15:27
|
(16) ну выполню я его в консольке и что я должна увидеть?
|
|||
19
Fragster
гуру
02.08.11
✎
15:27
|
(17) это оффтопик. просто наткнулся на его пост на sql.кг по этой теме, а он там забанен
|
|||
20
Fragster
гуру
02.08.11
✎
15:28
|
(18) что он тупит. а потом - потихоньку бить на куски и искать "крайнего". может, у тебя там индекса где нет
|
|||
21
Лялечка
02.08.11
✎
15:30
|
ох, спасибо :( попробую
|
|||
22
Лялечка
02.08.11
✎
15:32
|
Теперь бы еще в консоли его выполнить, ни разу этого не делала, там же надо половину заменить?
|
|||
23
Fragster
гуру
02.08.11
✎
15:33
|
(22) ну да
|
|||
24
Axel2009
02.08.11
✎
15:37
|
(22) может быть при включении технологического журнала покажется полный запрос.. но я не пробовал =)
|
|||
25
Лялечка
02.08.11
✎
16:10
|
(20) Я конечно понимаю, что задаю тупые вопросы, но я с RLS не сталкивалась ни разу. Я выполнила запрос в консоли. И как теперь проверить где есть индексы, а где их нет.
|
|||
26
Fragster
гуру
02.08.11
✎
16:15
|
начиная с самого вложенного запроса выполнять по кускам... в определенный момент будет резкое замедление... тут-то и станет понятно
|
|||
27
Axel2009
02.08.11
✎
16:17
|
(26) + для этого вполне подойдет консоль запросов (Инструменты разработчиков). там есть встроенное разбитие на дерево запроса и выполнение любой части с замером
|
|||
28
Лялечка
02.08.11
✎
16:47
|
Спасибо большое:)
|
|||
29
Лялечка
02.08.11
✎
16:48
|
(27) консоль запросов (ИР) скачала, но вот что-то дерево она не создает:(
|
|||
30
Axel2009
02.08.11
✎
16:49
|
(29) там нужно включить режим дерева запросов (6 кнопка справа)
|
|||
31
Лялечка
02.08.11
✎
17:03
|
(30) {Форма.ирПлатформа.Форма(164)}: Ошибка при вызове метода контекста (ПолучитьМакет)
ПолучитьМакет(ИмяКомпоненты).Записать(ФайлКомпоненты.ПолноеИмя); |
|||
32
Лялечка
10.08.11
✎
14:19
|
Добрый день! В продолжение темы. Очень медленно работает запрос. Проверила в консоли запросов, тормозит кусок
ВЫБРАТЬ 1 КАК КатегорииОбъектов ИЗ РегистрСведений.КатегорииОбъектов КАК КатегорииОбъектов ГДЕ КатегорииОбъектов.Категория.Наименование = "Поставщики" И ТекущаяТаблица.Ссылка = КатегорииОбъектов.Объект.Ссылка) Может можно его как-нибудь изменить. Заранее благодарна. |
|||
33
zak555
10.08.11
✎
14:21
|
КатегорииОбъектов.Категория.Наименование = "Поставщики"
убрать |
|||
34
Fragster
гуру
10.08.11
✎
14:23
|
.Объект.Ссылка - нафиг,
(33)+100, заменить на ссылку |
|||
35
Fragster
гуру
10.08.11
✎
14:24
|
а фоточка будет в личной карточке?
|
|||
36
Лялечка
10.08.11
✎
14:33
|
(33) Заменила на КатегорииОбъектов.Категория = ЗНАЧЕНИЕ(Справочник.КатегорииОбъектов.Постащики), .объект.Ссылка тоже заменила на .Объект (извиняюсь давно сделала,скопировала просто старый вариант). Толку ноль.
Как заментить КатегорииОбъектов.Категория.Наименование = "Поставщики" еще? |
|||
37
Лялечка
10.08.11
✎
14:33
|
(35) это как всегда принципиально?:)
|
|||
38
Fragster
гуру
10.08.11
✎
14:35
|
(36) Замени "Выбрать 1" На "выбрать первые 1 1"
добавь индекс по Категория в РС. (37) ага |
|||
39
Fragster
гуру
10.08.11
✎
14:36
|
ну и ниндекс по объекту, если нет (хотя должен быть)
|
|||
40
Лялечка
10.08.11
✎
14:47
|
Индекс по категории добавила, "выбрать" уже тоже заменила. Все из-за этого объекта наверное, там тип данных составной и я не знаю как его проиндексировать:( Получилось вот так, но работает все равно долго:(
##Если &ИспользоватьОграниченияПравДоступаНаУровнеЗаписей ##Тогда ТекущаяТаблица ИЗ #ТекущаяТаблица КАК ТекущаяТаблица ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ РАЗЛИЧНЫЕ СоставГруппы.Ссылка КАК ГруппаПользователей ИЗ Справочник.ГруппыПользователей.ПользователиГруппы КАК СоставГруппы ГДЕ СоставГруппы.Пользователь = &ТекущийПользователь ИЛИ СоставГруппы.Пользователь.Подразделение.Родитель = &ТекущееПодразделение ИЛИ СоставГруппы.Пользователь.Подразделение.Родитель.Родитель = &ТекущееПодразделение ИЛИ СоставГруппы.Пользователь.Подразделение.Родитель.Родитель.Родитель = &ТекущееПодразделение) КАК ГруппыПользователей ПО (&ИспользоватьОграниченияПравДоступаНаУровнеЗаписей) ГДЕ (&ИспользоватьОграниченияПравДоступаНаУровнеЗаписей = ЛОЖЬ #Параметр(3) ИЛИ (НЕ 1 В (ВЫБРАТЬ ПЕРВЫЕ 1 1 КАК ПолеОтбора ИЗ РегистрСведений.НазначениеВидовОбъектовДоступа КАК НазначениеВидовОбъектовДоступа ГДЕ НазначениеВидовОбъектовДоступа.ГруппаПользователей = ГруппыПользователей.ГруппаПользователей И ВЫБОР КОГДА НазначениеВидовОбъектовДоступа.ВидОбъектаДоступа = ЗНАЧЕНИЕ(Перечисление.ВидыОбъектовДоступа.#Параметр(1)) ТОГДА ВЫБОР КОГДА 1 В (ВЫБРАТЬ ПЕРВЫЕ 1 1 ИЗ РегистрСведений.НастройкиПравДоступаПользователей КАК НастройкиПравДоступаПользователей ГДЕ НастройкиПравДоступаПользователей.ОбъектДоступа = ТекущаяТаблица.#Параметр(2) И НастройкиПравДоступаПользователей.ВидОбъектаДоступа = ЗНАЧЕНИЕ(Перечисление.ВидыОбъектовДоступа.#Параметр(1)) И (НастройкиПравДоступаПользователей.Пользователь = НазначениеВидовОбъектовДоступа.ГруппаПользователей ИЛИ НастройкиПравДоступаПользователей.Пользователь = ЗНАЧЕНИЕ(Справочник.ГруппыПользователей.ВсеПользователи))) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ ИНАЧЕ ИСТИНА КОНЕЦ = ЛОЖЬ) И (1 В (ВЫБРАТЬ ПЕРВЫЕ 1 1 КАК КатегорииОбъектов ИЗ РегистрСведений.КатегорииОбъектов КАК КатегорииОбъектов ГДЕ КатегорииОбъектов.Категория = ЗНАЧЕНИЕ(Справочник.КатегорииОбъектов.Поставщик) И ТекущаяТаблица.Ссылка = КатегорииОбъектов.Объект))) И НЕ ГруппыПользователей.ГруппаПользователей ЕСТЬ NULL) ##КонецЕсли |
|||
41
Лялечка
10.08.11
✎
14:47
|
(38) ну раз так принципиально:)
|
|||
42
zak555
10.08.11
✎
15:02
|
(41) в личке не ты
|
|||
43
Лялечка
10.08.11
✎
15:04
|
(42) Чего? А кто это интересно?:) И почему не я?:)
|
|||
44
Лялечка
10.08.11
✎
15:07
|
(42)Очень даже я;)
|
|||
45
Fragster
гуру
10.08.11
✎
15:08
|
а точно в (40) тормозит именно этот кусок?
|
|||
46
Fragster
гуру
10.08.11
✎
15:09
|
потому как на файловой базе вот это круто тормозит: СоставГруппы.Пользователь = &ТекущийПользователь
ИЛИ СоставГруппы.Пользователь.Подразделение.Родитель = &ТекущееПодразделение ИЛИ СоставГруппы.Пользователь.Подразделение.Родитель.Родитель = &ТекущееПодразделение ИЛИ СоставГруппы.Пользователь.Подразделение.Родитель.Родитель.Родитель = &ТекущееПодразделение) КАК |
|||
47
Fragster
гуру
10.08.11
✎
15:09
|
есть решение, но много строк
|
|||
48
Лялечка
10.08.11
✎
15:11
|
(47) Если мой кусок убрать, то все прекрасно работает, а вот с ним нет:(
|
|||
49
Лялечка
10.08.11
✎
15:12
|
(47) какое решение?
|
|||
50
Fragster
гуру
10.08.11
✎
15:13
|
ВЫБРАТЬ
СоставГруппы.Ссылка КАК ГруппаПользователей ИЗ Справочник.ГруппыПользователей.ПользователиГруппы КАК СоставГруппы ГДЕ СоставГруппы.Пользователь = &ТекущийПользователь Объединить все ВЫБРАТЬ СоставГруппы.Ссылка КАК ГруппаПользователей ИЗ Справочник.ГруппыПользователей.ПользователиГруппы КАК СоставГруппы ГДЕ СоставГруппы.Пользователь.Подразделение.Родитель = &ТекущееПодразделение Объединить все ВЫБРАТЬ СоставГруппы.Ссылка КАК ГруппаПользователей ИЗ Справочник.ГруппыПользователей.ПользователиГруппы КАК СоставГруппы ГДЕ СоставГруппы.Пользователь.Подразделение.Родитель.Родитель = &ТекущееПодразделение ..... |
|||
51
Лялечка
10.08.11
✎
15:15
|
(50) Быстрее думаешь будет? Ща попробую, спасибо
|
|||
52
Fragster
гуру
10.08.11
✎
15:15
|
(51) на файолвой - да
|
|||
53
Aleks555
10.08.11
✎
15:18
|
(36) В 34 говорилось о том чтобы заменить на ссылку, а ты пишешь, что поменяла на: "объект.Ссылка тоже заменила на .Объект"
|
|||
54
Лялечка
10.08.11
✎
15:23
|
(53) я ошиблась, скопировала кусок кода не оттуда.
|
|||
55
Лялечка
10.08.11
✎
15:24
|
(52) работает немного быстрее, но все-таки тупит:(
|
|||
56
Fragster
гуру
10.08.11
✎
15:27
|
опять же для файловой (на скуле нет разницы)
вместо НастройкиПравДоступаПользователей.Пользователь = НазначениеВидовОбъектовДоступа.ГруппаПользователей ИЛИ НастройкиПравДоступаПользователей.Пользователь = ЗНАЧЕНИЕ(Справочник.ГруппыПользователей.ВсеПользователи написать НастройкиПравДоступаПользователей.Пользователь В (НазначениеВидовОбъектовДоступа.ГруппаПользователей,ЗНАЧЕНИЕ(Справочник.ГруппыПользователей.ВсеПользователи) |
|||
57
Nutsiiam
10.08.11
✎
15:27
|
в (46) человек тебе показал кусок, который тебе для начала нужно переписать. Если ты заточилась в рлс по ИЕРАРХИЮ, то значит ограничение ты спроектировала не правильно.
Самый простой способ у тебя: в подразделение добавить реквизит и пролить его неким разделителем, на равенство которого уже сравнивать в ГДЕ. |
|||
58
Лялечка
10.08.11
✎
15:33
|
(57) не поняла.
ограничение по Иерархии не я писала |
|||
59
Лялечка
10.08.11
✎
15:34
|
(56) у меня не файловая
|
|||
60
Nutsiiam
10.08.11
✎
15:36
|
(58) ты заточилась на иерархию - раз родителей несколько раз проверяешь. Если бы был оператор в иерархии - то ты бы его использовала ;) А это не правильно, и из-за этого все костыли.
|
|||
61
Лялечка
10.08.11
✎
15:36
|
(61) мне обязательно надо проверять иерархию
|
|||
62
Nutsiiam
10.08.11
✎
15:39
|
(61) я тебе говорю, раз все настолько медленно что ппц, нужно упростить твой запрос или до простого ГДЕ = или до простого иннер джойна, который все посечет.
Вот такие строки у тебя СоставГруппы.Пользователь.Подразделение.Родитель.Родитель.Родитель разворачиватся в джойны-переджойны-переджойны =) А типовая конфа - УТ чтоль? |
|||
63
Aleks555
10.08.11
✎
15:41
|
А что такое "ТекущееПодразделение", как оно с правами соотносится?
|
|||
64
Fragster
гуру
10.08.11
✎
15:42
|
(63) это параметр сеанса, судя по всему
|
|||
65
Лялечка
10.08.11
✎
15:43
|
(62) Нет, не УТ. Я не знаю как упростить запрос, поэтому и спрашиваю.
|
|||
66
Лялечка
10.08.11
✎
15:43
|
(63) да, параметр сеанса
|
|||
67
Nutsiiam
10.08.11
✎
15:43
|
я так полагаю это подразделение, в котором сидит пользователь. И именно по верхней группе, нужно фильтрить контрагентов :) Т.е. типа - этому подразделению видны эти чуваки, этому - эти.
|
|||
68
Fragster
гуру
10.08.11
✎
15:45
|
нужно сделать денормализацию - РС со всеми подразделеинями пользователя, ПриЗаписи обновлять....
|
|||
69
Лялечка
10.08.11
✎
15:47
|
(67) Проверка такая: если пользователь по иерархии выше, то он видит всех контрагентов, которых видят подчиненные, и в то же время видит контрагентов определенной категории
|
|||
70
Лялечка
10.08.11
✎
15:49
|
(68) это как?
|
|||
71
Nutsiiam
10.08.11
✎
15:51
|
а самый низжий пользователь что видит - только контрагентов определенной категории?
|
|||
72
Aleks555
10.08.11
✎
15:57
|
А нельзя это все сделать через Группу доступа контрагентов?, кот-я задается на вкладке "Прочее" элемента справочника контрагенты?
|
|||
73
Лялечка
10.08.11
✎
15:57
|
(72) есть реквизит "Регион", в зависимости от него определяются группы доступа, вот нижний видит только свой регион и определенную категорию, верхний - все регионы и определенную категорию
|
|||
74
Лялечка
10.08.11
✎
15:58
|
(72) группа доступа настроена в зависимости от региона
|
|||
75
Лялечка
10.08.11
✎
15:58
|
и вот проверяется группаДоступа, иерархия и категория
|
|||
76
Aleks555
10.08.11
✎
16:13
|
я бы всё-же вернулся к "В ИЕРАРХИИ (&Группа)" вместо родителя, либо вместо "Группа" указать результат запроса.
|
|||
77
Лялечка
10.08.11
✎
16:18
|
(76) так RLS же
|
|||
78
acsent
10.08.11
✎
16:24
|
(76) нету в рлс иерархии
|
|||
79
Aleks555
10.08.11
✎
16:31
|
а "есть Null" есть?
|
|||
80
Лялечка
10.08.11
✎
16:32
|
(79) ну как видишь есть:)
|
|||
81
Aleks555
10.08.11
✎
16:33
|
а чем они особо отличаются, тоже логический оператор..
|
|||
82
Лялечка
10.08.11
✎
16:38
|
(81) ох, не знаю...
|
|||
83
Aleks555
10.08.11
✎
17:04
|
Как вариант, еще можно было бы вот этот Родитель.Родитель загнать во временную таблицу, проиндексировать и в секции где уже сравнивать с результатом временной таблицы,по идее должно побыстрее работать.
|
|||
84
Лялечка
10.08.11
✎
17:15
|
еще вопросик: у меня шаблон ограничения стоит на поле <прочие поля>, родитель, ссылка, код - ограничений нет. Объясните, как определить куда ограничения, почему не ограничиваются поля родитель, ссылка, код? (это типовой вариант)
|
|||
85
Nutsiiam
10.08.11
✎
17:38
|
какая ирерахия в рлс, какие временные таблицы? :)
|
|||
86
Aleks555
10.08.11
✎
17:43
|
(85) где дельный совет от тебя? Скажи как правильно сделать:)
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |