|
Помогите опимизировать запрос | ☑ | ||
---|---|---|---|---|
0
Pirate_
22.02.12
✎
20:04
|
Сложная система прав с приоритетами и т.д. Были тормоза с динамическим определением права при проведении документе, прешли на систему записи полного работа прав при установке этих прав.Тормоза при выбоке прав ушли но стала новая проблема. Выполнение запроса возвращает около 800-900 тыс.строк. В файловом варианте запрос и запись в регистр (НаборЗаписейПрав.Загрузить(Запрос.Выполнить().Выгрузить());) занимает 6 мин. В SQL варианте 4 часа. У меня уже глаза на лоб лезут ничего придумать не могу. Прошу помощи сообщества.
ЗЫ Такая система прав действительно нужна упрощение даже не отговаривается. Сам запрос: ВЫБРАТЬ НазначениеПравДоступаКСтатьямиСрезПоследних.Пользователь КАК Пользователь, НазначениеПравДоступаКСтатьямиСрезПоследних.Использовать КАК ПравоИспользования, НазначениеПравДоступаКСтатьямиСрезПоследних.Коректировка КАК ПравоКорректировкиЗапросаНарасход, НазначениеПравДоступаКСтатьямиСрезПоследних.СуммаУтверждения КАК ПравоКорректировкиЗапросанаРасходССуммойНеВышеN, НазначениеПравДоступаКСтатьямиСрезПоследних.ПроцентУтверждения КАК ПравоКорректировкиЗапросанаРасходССуммойНеБолееМ, НазначениеПравДоступаКСтатьямиСрезПоследних.ЛюбаяСумма КАК ПравоУтвержденияЗапросаНаРасходСЛюбойСуммой, НазначениеПравДоступаКСтатьямиСрезПоследних.УтверждениеОплаты КАК ПравоУтвержденияОплаты, НазначениеПравДоступаКСтатьямиСрезПоследних.ОтменаРасхода КАК ПравоОтменыРасхода, НазначениеПравДоступаКСтатьямиСрезПоследних.Перераспределение КАК ПравоПерераспределенияВРамкахСтатьи, НазначениеПравДоступаКСтатьямиСрезПоследних.Куратор КАК ПравоКуратора, НазначениеПравДоступаКСтатьямиСрезПоследних.БюджетныйКомитет КАК ПравоБюджетногоКомитета, ЕСТЬNULL(ОбособленныеПодразделенияБанка.Ссылка, НазначениеПравДоступаКСтатьямиСрезПоследних.ПодразделениеБанка) КАК ПодразделениеБанка, ЕСТЬNULL(СтатьиЗатратЦентровОтветственности.Ссылка, НазначениеПравДоступаКСтатьямиСрезПоследних.СтатьяЗатрат) КАК СтатьяЗатрат, ЕСТЬNULL(Проекты.Ссылка, НазначениеПравДоступаКСтатьямиСрезПоследних.Проект) КАК Проект, НазначениеПравДоступаКСтатьямиСрезПоследних.Период КАК Период, ВЫБОР КОГДА НазначениеПравДоступаКСтатьямиСрезПоследних.ПодразделениеБанка <> ЗНАЧЕНИЕ(Справочник.ОбособленныеПодразделенияБанка.ПустаяСсылка) И НазначениеПравДоступаКСтатьямиСрезПоследних.СтатьяЗатрат <> ЗНАЧЕНИЕ(Справочник.СтатьиЗатратЦентровОтветственности.ПустаяСсылка) И НазначениеПравДоступаКСтатьямиСрезПоследних.ЦентрОтветственности <> ЗНАЧЕНИЕ(Справочник.ЦентрыОтветственности.ПустаяСсылка) И НазначениеПравДоступаКСтатьямиСрезПоследних.Проект <> ЗНАЧЕНИЕ(Справочник.Проекты.ПустаяСсылка) ТОГДА 0 КОГДА НЕ НазначениеПравДоступаКСтатьямиСрезПоследних.Использовать ТОГДА 1 КОГДА НазначениеПравДоступаКСтатьямиСрезПоследних.ПодразделениеБанка = ЗНАЧЕНИЕ(Справочник.ОбособленныеПодразделенияБанка.ПустаяСсылка) И НазначениеПравДоступаКСтатьямиСрезПоследних.СтатьяЗатрат <> ЗНАЧЕНИЕ(Справочник.СтатьиЗатратЦентровОтветственности.ПустаяСсылка) И НазначениеПравДоступаКСтатьямиСрезПоследних.ЦентрОтветственности <> ЗНАЧЕНИЕ(Справочник.ЦентрыОтветственности.ПустаяСсылка) И НазначениеПравДоступаКСтатьямиСрезПоследних.Проект <> ЗНАЧЕНИЕ(Справочник.Проекты.ПустаяСсылка) ТОГДА 2 КОГДА НазначениеПравДоступаКСтатьямиСрезПоследних.ПодразделениеБанка <> ЗНАЧЕНИЕ(Справочник.ОбособленныеПодразделенияБанка.ПустаяСсылка) И НазначениеПравДоступаКСтатьямиСрезПоследних.СтатьяЗатрат <> ЗНАЧЕНИЕ(Справочник.СтатьиЗатратЦентровОтветственности.ПустаяСсылка) И НазначениеПравДоступаКСтатьямиСрезПоследних.ЦентрОтветственности <> ЗНАЧЕНИЕ(Справочник.ЦентрыОтветственности.ПустаяСсылка) И НазначениеПравДоступаКСтатьямиСрезПоследних.Проект = ЗНАЧЕНИЕ(Справочник.Проекты.ПустаяСсылка) ТОГДА 3 КОГДА НазначениеПравДоступаКСтатьямиСрезПоследних.ПодразделениеБанка = ЗНАЧЕНИЕ(Справочник.ОбособленныеПодразделенияБанка.ПустаяСсылка) И НазначениеПравДоступаКСтатьямиСрезПоследних.СтатьяЗатрат <> ЗНАЧЕНИЕ(Справочник.СтатьиЗатратЦентровОтветственности.ПустаяСсылка) И НазначениеПравДоступаКСтатьямиСрезПоследних.ЦентрОтветственности <> ЗНАЧЕНИЕ(Справочник.ЦентрыОтветственности.ПустаяСсылка) И НазначениеПравДоступаКСтатьямиСрезПоследних.Проект = ЗНАЧЕНИЕ(Справочник.Проекты.ПустаяСсылка) ТОГДА 4 КОГДА НазначениеПравДоступаКСтатьямиСрезПоследних.ПодразделениеБанка <> ЗНАЧЕНИЕ(Справочник.ОбособленныеПодразделенияБанка.ПустаяСсылка) И НазначениеПравДоступаКСтатьямиСрезПоследних.СтатьяЗатрат = ЗНАЧЕНИЕ(Справочник.СтатьиЗатратЦентровОтветственности.ПустаяСсылка) И НазначениеПравДоступаКСтатьямиСрезПоследних.ЦентрОтветственности <> ЗНАЧЕНИЕ(Справочник.ЦентрыОтветственности.ПустаяСсылка) И НазначениеПравДоступаКСтатьямиСрезПоследних.Проект <> ЗНАЧЕНИЕ(Справочник.Проекты.ПустаяСсылка) ТОГДА 5 КОГДА НазначениеПравДоступаКСтатьямиСрезПоследних.ПодразделениеБанка = ЗНАЧЕНИЕ(Справочник.ОбособленныеПодразделенияБанка.ПустаяСсылка) И НазначениеПравДоступаКСтатьямиСрезПоследних.СтатьяЗатрат = ЗНАЧЕНИЕ(Справочник.СтатьиЗатратЦентровОтветственности.ПустаяСсылка) И НазначениеПравДоступаКСтатьямиСрезПоследних.ЦентрОтветственности <> ЗНАЧЕНИЕ(Справочник.ЦентрыОтветственности.ПустаяСсылка) И НазначениеПравДоступаКСтатьямиСрезПоследних.Проект <> ЗНАЧЕНИЕ(Справочник.Проекты.ПустаяСсылка) ТОГДА 6 КОГДА НазначениеПравДоступаКСтатьямиСрезПоследних.ПодразделениеБанка <> ЗНАЧЕНИЕ(Справочник.ОбособленныеПодразделенияБанка.ПустаяСсылка) И НазначениеПравДоступаКСтатьямиСрезПоследних.СтатьяЗатрат = ЗНАЧЕНИЕ(Справочник.СтатьиЗатратЦентровОтветственности.ПустаяСсылка) И НазначениеПравДоступаКСтатьямиСрезПоследних.ЦентрОтветственности <> ЗНАЧЕНИЕ(Справочник.ЦентрыОтветственности.ПустаяСсылка) И НазначениеПравДоступаКСтатьямиСрезПоследних.Проект = ЗНАЧЕНИЕ(Справочник.Проекты.ПустаяСсылка) ТОГДА 7 КОГДА НазначениеПравДоступаКСтатьямиСрезПоследних.ПодразделениеБанка = ЗНАЧЕНИЕ(Справочник.ОбособленныеПодразделенияБанка.ПустаяСсылка) И НазначениеПравДоступаКСтатьямиСрезПоследних.СтатьяЗатрат = ЗНАЧЕНИЕ(Справочник.СтатьиЗатратЦентровОтветственности.ПустаяСсылка) И НазначениеПравДоступаКСтатьямиСрезПоследних.ЦентрОтветственности <> ЗНАЧЕНИЕ(Справочник.ЦентрыОтветственности.ПустаяСсылка) И НазначениеПравДоступаКСтатьямиСрезПоследних.Проект = ЗНАЧЕНИЕ(Справочник.Проекты.ПустаяСсылка) ТОГДА 8 КОГДА НазначениеПравДоступаКСтатьямиСрезПоследних.ПодразделениеБанка <> ЗНАЧЕНИЕ(Справочник.ОбособленныеПодразделенияБанка.ПустаяСсылка) И НазначениеПравДоступаКСтатьямиСрезПоследних.СтатьяЗатрат = ЗНАЧЕНИЕ(Справочник.СтатьиЗатратЦентровОтветственности.ПустаяСсылка) И НазначениеПравДоступаКСтатьямиСрезПоследних.ЦентрОтветственности = ЗНАЧЕНИЕ(Справочник.ЦентрыОтветственности.ПустаяСсылка) И НазначениеПравДоступаКСтатьямиСрезПоследних.Проект <> ЗНАЧЕНИЕ(Справочник.Проекты.ПустаяСсылка) ТОГДА 9 КОГДА НазначениеПравДоступаКСтатьямиСрезПоследних.ПодразделениеБанка = ЗНАЧЕНИЕ(Справочник.ОбособленныеПодразделенияБанка.ПустаяСсылка) И НазначениеПравДоступаКСтатьямиСрезПоследних.СтатьяЗатрат = ЗНАЧЕНИЕ(Справочник.СтатьиЗатратЦентровОтветственности.ПустаяСсылка) И НазначениеПравДоступаКСтатьямиСрезПоследних.ЦентрОтветственности = ЗНАЧЕНИЕ(Справочник.ЦентрыОтветственности.ПустаяСсылка) И НазначениеПравДоступаКСтатьямиСрезПоследних.Проект <> ЗНАЧЕНИЕ(Справочник.Проекты.ПустаяСсылка) ТОГДА 10 КОГДА НазначениеПравДоступаКСтатьямиСрезПоследних.ПодразделениеБанка <> ЗНАЧЕНИЕ(Справочник.ОбособленныеПодразделенияБанка.ПустаяСсылка) И НазначениеПравДоступаКСтатьямиСрезПоследних.СтатьяЗатрат = ЗНАЧЕНИЕ(Справочник.СтатьиЗатратЦентровОтветственности.ПустаяСсылка) И НазначениеПравДоступаКСтатьямиСрезПоследних.ЦентрОтветственности = ЗНАЧЕНИЕ(Справочник.ЦентрыОтветственности.ПустаяСсылка) И НазначениеПравДоступаКСтатьямиСрезПоследних.Проект = ЗНАЧЕНИЕ(Справочник.Проекты.ПустаяСсылка) ТОГДА 11 КОГДА НазначениеПравДоступаКСтатьямиСрезПоследних.ПодразделениеБанка = ЗНАЧЕНИЕ(Справочник.ОбособленныеПодразделенияБанка.ПустаяСсылка) И НазначениеПравДоступаКСтатьямиСрезПоследних.СтатьяЗатрат = ЗНАЧЕНИЕ(Справочник.СтатьиЗатратЦентровОтветственности.ПустаяСсылка) И НазначениеПравДоступаКСтатьямиСрезПоследних.ЦентрОтветственности = ЗНАЧЕНИЕ(Справочник.ЦентрыОтветственности.ПустаяСсылка) И НазначениеПравДоступаКСтатьямиСрезПоследних.Проект = ЗНАЧЕНИЕ(Справочник.Проекты.ПустаяСсылка) ТОГДА 12 КОНЕЦ КАК Приоритет ПОМЕСТИТЬ ПолнаяВыборка ИЗ РегистрСведений.НазначениеПравДоступаКСтатьям.СрезПоследних(&Период, Пользователь = &Пользователь) КАК НазначениеПравДоступаКСтатьямиСрезПоследних ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ОбособленныеПодразделенияБанка КАК ОбособленныеПодразделенияБанка ПО (НазначениеПравДоступаКСтатьямиСрезПоследних.ПодразделениеБанка = ЗНАЧЕНИЕ(Справочник.ОбособленныеПодразделенияБанка.ПустаяСсылка)) ЛЕВОЕ СОЕДИНЕНИЕ Справочник.СтатьиЗатратЦентровОтветственности КАК СтатьиЗатратЦентровОтветственности ПО (НазначениеПравДоступаКСтатьямиСрезПоследних.СтатьяЗатрат = ЗНАЧЕНИЕ(Справочник.СтатьиЗатратЦентровОтветственности.ПустаяСсылка)) И (НазначениеПравДоступаКСтатьямиСрезПоследних.ЦентрОтветственности = ЗНАЧЕНИЕ(Справочник.ЦентрыОтветственности.ПустаяСсылка) ИЛИ НазначениеПравДоступаКСтатьямиСрезПоследних.ЦентрОтветственности = СтатьиЗатратЦентровОтветственности.Владелец) ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Проекты КАК Проекты ПО (НазначениеПравДоступаКСтатьямиСрезПоследних.Проект = ЗНАЧЕНИЕ(Справочник.Проекты.ПустаяСсылка)) ИНДЕКСИРОВАТЬ ПО Пользователь, ПодразделениеБанка, СтатьяЗатрат, Проект, Период, Приоритет ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ РАЗЛИЧНЫЕ ПолнаяВыборка.Пользователь КАК Пользователь, ПолнаяВыборка.ПодразделениеБанка КАК ПодразделениеБанка, ПолнаяВыборка.СтатьяЗатрат КАК СтатьяЗатрат, ПолнаяВыборка.Проект КАК Проект, ПолнаяВыборка.Период КАК Период, МИНИМУМ(ПолнаяВыборка.Приоритет) КАК Приоритет ПОМЕСТИТЬ ПолныйНаборИзмерений ИЗ ПолнаяВыборка КАК ПолнаяВыборка СГРУППИРОВАТЬ ПО ПолнаяВыборка.Пользователь, ПолнаяВыборка.ПодразделениеБанка, ПолнаяВыборка.СтатьяЗатрат, ПолнаяВыборка.Проект, ПолнаяВыборка.Период ИНДЕКСИРОВАТЬ ПО Пользователь, ПодразделениеБанка, СтатьяЗатрат, Проект, Период, Приоритет ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ПолныйНаборИзмерений.Пользователь, ПолныйНаборИзмерений.ПодразделениеБанка КАК ПодразделениеБанка, ПолныйНаборИзмерений.СтатьяЗатрат, ПолныйНаборИзмерений.Проект, ПолныйНаборИзмерений.Период КАК Период, ПолныйНаборИзмерений.Приоритет, ПолнаяВыборка.ПравоИспользования, ПолнаяВыборка.ПравоКорректировкиЗапросаНарасход, ПолнаяВыборка.ПравоКорректировкиЗапросанаРасходССуммойНеВышеN, ПолнаяВыборка.ПравоКорректировкиЗапросанаРасходССуммойНеБолееМ, ПолнаяВыборка.ПравоУтвержденияЗапросаНаРасходСЛюбойСуммой, ПолнаяВыборка.ПравоУтвержденияОплаты, ПолнаяВыборка.ПравоОтменыРасхода, ПолнаяВыборка.ПравоПерераспределенияВРамкахСтатьи, ПолнаяВыборка.ПравоКуратора, ПолнаяВыборка.ПравоБюджетногоКомитета ИЗ ПолныйНаборИзмерений КАК ПолныйНаборИзмерений ВНУТРЕННЕЕ СОЕДИНЕНИЕ ПолнаяВыборка КАК ПолнаяВыборка ПО ПолныйНаборИзмерений.Пользователь = ПолнаяВыборка.Пользователь И ПолныйНаборИзмерений.ПодразделениеБанка = ПолнаяВыборка.ПодразделениеБанка И ПолныйНаборИзмерений.СтатьяЗатрат = ПолнаяВыборка.СтатьяЗатрат И ПолныйНаборИзмерений.Проект = ПолнаяВыборка.Проект И ПолныйНаборИзмерений.Период = ПолнаяВыборка.Период И ПолныйНаборИзмерений.Приоритет = ПолнаяВыборка.Приоритет УПОРЯДОЧИТЬ ПО Период, ПодразделениеБанка |
|||
1
asady
22.02.12
✎
23:08
|
(0) чем типовые не устроили?
на что у нас были хотелки - и то разрулили в рамках типового механизма с небольшими доделками. |
|||
2
AlexNew
22.02.12
✎
23:28
|
А в 1 - ю таблицу из вставить не желаете свои условия? (ПодразделениеБанка = ПодразделениеБанка или ПустаяСсылка) и т.д.?
|
|||
3
Pirate_
22.02.12
✎
23:47
|
(1) объясню упрощенно один из примеров один пользователь может тратить любые деньги по своему подразделению но не по статье1 и статье2 и суммы каждой траты не более 100 рублей + может тратить любые суммы по статье15 по любому подразделению. Запись в регистре выбирается
Подразделение1 пустаяссылка истина 100 Подразделение1 статья1 Ложь 0 Подразделение1 статья2 Ложь 0 пустаяссылка Статья15 истина 0 По этим Четырем записям сформируются полный набор прав по всем подразделениям и статьям. Есть таблица приоритетов по набору измерений выбирается запись(если по приведенному запросу) с минимальным приоритетом. (2) Или не подходит. Исходя из заполненности выбирается более приоритетная запись. |
|||
4
Pirate_
22.02.12
✎
23:56
|
(1) если такой механизм в RLS запихнуть оно помрет сразу, основной вопрос в принципе такой:
Почему в файловой выборка и запись занимает 6 минут, а в SQL 4 часа я подозреваю что конструкция ВЫБОР КОГДА ТОГДА отрабатывает совсем по другому, подскажите как можно заменить. |
|||
5
AlexNew
22.02.12
✎
23:56
|
Если у пользователя это уже есть?
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ОбособленныеПодразделенияБанка КАК ОбособленныеПодразделенияБанка ПО (НазначениеПравДоступаКСтатьямиСрезПоследних.ПодразделениеБанка = ЗНАЧЕНИЕ(Справочник.ОбособленныеПодразделенияБанка.ПустаяСсылка)) ЛЕВОЕ СОЕДИНЕНИЕ Справочник.СтатьиЗатратЦентровОтветственности КАК СтатьиЗатратЦентровОтветственности ПО (НазначениеПравДоступаКСтатьямиСрезПоследних.СтатьяЗатрат = ЗНАЧЕНИЕ(Справочник.СтатьиЗатратЦентровОтветственности.ПустаяСсылка)) И (НазначениеПравДоступаКСтатьямиСрезПоследних.ЦентрОтветственности = ЗНАЧЕНИЕ(Справочник.ЦентрыОтветственности.ПустаяСсылка) ИЛИ НазначениеПравДоступаКСтатьямиСрезПоследних.ЦентрОтветственности = СтатьиЗатратЦентровОтветственности.Владелец) ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Проекты КАК Проекты ПО (НазначениеПравДоступаКСтатьямиСрезПоследних.Проект = ЗНАЧЕНИЕ(Справочник.Проекты.ПустаяСсылка)) |
|||
6
AlexNew
22.02.12
✎
23:58
|
(4) Может загнать в SQL и план запроса посмотреть? Загнать в erf, разбить с временными таблицами и посмотреть запрос производительности?
|
|||
7
Pirate_
23.02.12
✎
00:02
|
(5) я показал таблицу (3)в которой в некоторых строках не указаны значения, то есть если не заполнено то выбираются все элементы справочника. Для этого конструкция с соединениями чтобы дополнить всеми значениями.
|
|||
8
AlexNew
23.02.12
✎
00:10
|
(7) А я ничего не показывал, может посмотришь?
|
|||
9
Pirate_
23.02.12
✎
00:22
|
(7) я наверно туплю, но я не пойму о чем вы говорите. Условие одно - Пользователь для него выбирается весь набор прав и записывается в другой рег сведений с которым оперируют документы.
|
|||
10
Inform
23.02.12
✎
00:25
|
(0)
РегистрСведений.НазначениеПравДоступаКСтатьям.СрезПоследних(&Период, Пользователь = &Пользователь) КАК НазначениеПравДоступаКСтатьямиСрезПоследних ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ОбособленныеПодразделенияБанка КАК ОбособленныеПодразделенияБанка ПО (НазначениеПравДоступаКСтатьямиСрезПоследних.ПодразделениеБанка = ЗНАЧЕНИЕ(Справочник.ОбособленныеПодразделенияБанка.ПустаяСсылка)) И ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Проекты КАК Проекты ПО (НазначениеПравДоступаКСтатьямиСрезПоследних.Проект = ЗНАЧЕНИЕ(Справочник.Проекты.ПустаяСсылка)) С какой целью сделаны? |
|||
11
AlexNew
23.02.12
✎
00:25
|
(9) Одно из двух, ты из виртуальной таблицы получишь.
|
|||
12
Pirate_
23.02.12
✎
00:32
|
(11)Да поскольку приоритеты у них равнозначны и это отдано на откуп пользователя, по запросу видно что измерений 4, а уровней приоритетов 12 (не считая нулевого)
|
|||
13
AlexNew
23.02.12
✎
00:36
|
РегистрСведений.НазначениеПравДоступаКСтатьям измерения???
|
|||
14
Pirate_
23.02.12
✎
00:37
|
Статьи подчиненный справочник справочника центры ответсвенности
|
|||
15
Inform
23.02.12
✎
00:38
|
(0) объясню подробно как работает то, что написано в (10):
К записям регистра где пустое подразделение банка клеется ВСЯ таблица справочника подразделений, такая же ситуация с проектами. Нафуя? |
|||
16
AlexNew
23.02.12
✎
00:42
|
(15) Так таки она одна?
|
|||
17
Inform
23.02.12
✎
00:43
|
(16) она это кто? Запись с пустым подразделением в регистре или 1 запись в справочнике подразделений?
|
|||
18
AlexNew
23.02.12
✎
00:44
|
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ОбособленныеПодразделенияБанка КАК ОбособленныеПодразделенияБанка
ПО (НазначениеПравДоступаКСтатьямиСрезПоследних.ПодразделениеБанка = ЗНАЧЕНИЕ(Справочник.ОбособленныеПодразделенияБанка.ПустаяСсылка)) ЛЕВОЕ СОЕДИНЕНИЕ Справочник.СтатьиЗатратЦентровОтветственности КАК СтатьиЗатратЦентровОтветственности ПО (НазначениеПравДоступаКСтатьямиСрезПоследних.СтатьяЗатрат = ЗНАЧЕНИЕ(Справочник.СтатьиЗатратЦентровОтветственности.ПустаяСсылка)) И (НазначениеПравДоступаКСтатьямиСрезПоследних.ЦентрОтветственности = ЗНАЧЕНИЕ(Справочник.ЦентрыОтветственности.ПустаяСсылка) ИЛИ НазначениеПравДоступаКСтатьямиСрезПоследних.ЦентрОтветственности = СтатьиЗатратЦентровОтветственности.Владелец) ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Проекты КАК Проекты ПО (НазначениеПравДоступаКСтатьямиСрезПоследних.Проект = ЗНАЧЕНИЕ(Справочник.Проекты.ПустаяСсылка)) |
|||
19
AlexNew
23.02.12
✎
00:47
|
Вот это в вирт таблицу, если я нечетко выразился.
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ОбособленныеПодразделенияБанка КАК ОбособленныеПодразделенияБанка ПО (НазначениеПравДоступаКСтатьямиСрезПоследних.ПодразделениеБанка = ЗНАЧЕНИЕ(Справочник.ОбособленныеПодразделенияБанка.ПустаяСсылка)) ЛЕВОЕ СОЕДИНЕНИЕ Справочник.СтатьиЗатратЦентровОтветственности КАК СтатьиЗатратЦентровОтветственности ПО (НазначениеПравДоступаКСтатьямиСрезПоследних.СтатьяЗатрат = ЗНАЧЕНИЕ(Справочник.СтатьиЗатратЦентровОтветственности.ПустаяСсылка)) И (НазначениеПравДоступаКСтатьямиСрезПоследних.ЦентрОтветственности = ЗНАЧЕНИЕ(Справочник.ЦентрыОтветственности.ПустаяСсылка) ИЛИ НазначениеПравДоступаКСтатьямиСрезПоследних.ЦентрОтветственности = СтатьиЗатратЦентровОтветственности.Владелец) ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Проекты КАК Проекты ПО (НазначениеПравДоступаКСтатьямиСрезПоследних.Проект = ЗНАЧЕНИЕ(Справочник.Проекты.ПустаяСсылка)) |
|||
20
Pirate_
23.02.12
✎
00:49
|
Еще раз посмотрите пример записи в (3) в случае не заполенности реквизита выданные права действуют на все элементы ели не перебиты правом с меньшим приоритетом
попробую еще раз Пустаяссылка Статья1 истина Подразделение3 статья1 Ложь Ему разрешены траты по статье1 по всем подразделениям кроме Подразделение3 Зарос позваращает Подразделение3 статья1 Ложь Подразделение1 Статья1 истина Подразделение2 Статья1 истина Эти данные записываются в другой регистр по которому смотрят документы. статей подразделений проектов ДОФИГА |
|||
21
AlexNew
23.02.12
✎
00:50
|
(0) Cтоп, сначала собрать виртуальную таблицу пользователя, а потом в висртуальной В &
|
|||
22
AlexNew
23.02.12
✎
00:52
|
Для правил "пустое" значение тоже добавляется, обычно.
|
|||
23
Inform
23.02.12
✎
00:54
|
(20) на примере попробую объяснить, вот что в таблице сейчас получится:
| ПодразделениеИзРегистра | ПодразделениеИзСправочника | <ПустаяСсылкаПодразделение> Подразделение1 <ПустаяСсылкаПодразделение> Подразделение2 ... <ПустаяСсылкаПодразделение> ПодразделениеN <ЗаполненноеПодразделение> Null <ЗаполненноеПодразделение> Null ... <ЗаполненноеПодразделение> Null Или нет? |
|||
24
Pirate_
23.02.12
✎
00:55
|
(21) (22) честно не понял
Измерения регистра Пользователь статьязатрат подразделениебанка проект ЦентрОтветвенности + куча ресурсов |
|||
25
Pirate_
23.02.12
✎
00:56
|
(23) нет, получаем полный перебор всех возможных измерений
|
|||
26
Inform
23.02.12
✎
00:58
|
(25) проверь...
|
|||
27
Pirate_
23.02.12
✎
01:06
|
(26) блин запрос работоспособен и работает 2 года, но поскольку на предприятии стали уменьшать кадры появилось много пересекающихся прав и в случае добавления в справочник нового подразделения/статьи и т.д. обновление прав не успевает выполница за ночь. У меня нет претензий к работоспособности и качестве выходных данных. У меня проблема производительности. На серверном варианте по одному пользователю выполняется 4 часа в тоже время эта же база но в файловом 6 минут.
|
|||
28
Pirate_
23.02.12
✎
01:09
|
По примеру (20) запрос вернет столько записей сколько подразделений в справочнике.
|
|||
29
AlexNew
23.02.12
✎
01:15
|
Я промолчу, было длинно, сразу не прочел
НазначениеПравДоступаКСтатьямиСрезПоследних ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ОбособленныеПодразделенияБанка КАК ОбособленныеПодразделенияБанка ПО (НазначениеПравДоступаКСтатьямиСрезПоследних.ПодразделениеБанка = ЗНАЧЕНИЕ(Справочник.ОбособленныеПодразделенияБанка.ПустаяСсылка)) ЛЕВОЕ СОЕДИНЕНИЕ Справочник.СтатьиЗатратЦентровОтветственности КАК СтатьиЗатратЦентровОтветственности ПО (НазначениеПравДоступаКСтатьямиСрезПоследних.СтатьяЗатрат = ЗНАЧЕНИЕ(Справочник.СтатьиЗатратЦентровОтветственности.ПустаяСсылка)) И (НазначениеПравДоступаКСтатьямиСрезПоследних.ЦентрОтветственности = ЗНАЧЕНИЕ(Справочник.ЦентрыОтветственности.ПустаяСсылка) ИЛИ НазначениеПравДоступаКСтатьямиСрезПоследних.ЦентрОтветственности = СтатьиЗатратЦентровОтветственности.Владелец) ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Проекты КАК Проекты ПО (НазначениеПравДоступаКСтатьямиСрезПоследних.Проект = ЗНАЧЕНИЕ(Справочник.Проекты.ПустаяСсылка)) |
|||
30
AlexNew
23.02.12
✎
01:19
|
А NULL когда отменили?
|
|||
31
Pirate_
23.02.12
✎
01:20
|
(29) о чем промолчите? Статьи затрат подчинены Центрамответствености для выдачи прав только по набору статей ЦО
(30) его никто не отменял: ЕСТЬNULL(ОбособленныеПодразделенияБанка.Ссылка, НазначениеПравДоступаКСтатьямиСрезПоследних.ПодразделениеБанка) КАК ПодразделениеБанка, |
|||
32
Pirate_
23.02.12
✎
01:30
|
(30) (29) запрос выдает правильные данные давайте примим это как аксиому, если вам проще то выдает данные как просил заказчик и никак иначе. Возможно я сделал что-то не оптимально или вообще не правильно с точки зрения производительности. Меня нужно натолкнуть на то как можно оптимизировать/ускорить не изменив результат запроса.
|
|||
33
France
23.02.12
✎
01:33
|
может, все же начнем с "ЗЫ Такая система прав действительно нужна упрощение даже не отговаривается. "??? почему бы не пообсуждать..
|
|||
34
Pirate_
23.02.12
✎
01:38
|
* Я прошу натолкнуть на то, почему он так долго выполняется. В меня большие подозрения на конструкцию ВЫБОР КОГДА ТОГДА подтвердите или опровергните или выскажите свою мысль чтобы мне было куда копать, благо лопата на плечах есть просто я зашел в тупик.
(33) с таким же успехом можно обсуждать, есть ли жизнь на Марсе, не обижайтесь но это ведь маленькая часть всей системы. Политика прав уже и так уменьшена до теоретического минимума с бизнесовой точки зрения. Проблем с проведением и контролем никаких. Есть только проблема при выдаче либо при переформировании набора прав. |
|||
35
AlexNew
23.02.12
✎
01:39
|
ПО (НазначениеПравДоступаКСтатьямиСрезПоследних.ПодразделениеБанка = ЗНАЧЕНИЕ(Справочник.ОбособленныеПодразделенияБанка.ПустаяСсылка))
|
|||
36
France
23.02.12
✎
01:39
|
(34) нам то чего обижаться, не у нас же проблемы в бизнесе, когда права по 4-6 минут определяются)) успехов..
|
|||
37
AlexNew
23.02.12
✎
01:40
|
Не то..
|
|||
38
France
23.02.12
✎
01:40
|
и трассировку сиквела в руки... с планами оптимизации.
|
|||
39
AlexNew
23.02.12
✎
01:43
|
(38) Когда еще говорили про сервер, а я прослушал, но не факт...
|
|||
40
Pirate_
23.02.12
✎
01:44
|
(36) вы не поняли сути, это разовая задача которая выполняется 1-2 раза для пользователя или при добавлении нового объекта например подразделения.
|
|||
41
Pirate_
23.02.12
✎
01:44
|
но для всех пользователей она должна выполница за ночь
|
|||
42
AlexNew
23.02.12
✎
01:47
|
НаборЗаписейПрав.Загрузить(Запрос.Выполнить().Выгрузить())
Надо ворсос внимательней читать? Трассировка что сказала? |
|||
43
Pirate_
23.02.12
✎
01:49
|
(42) это уже только завтра
а можно как-то свои сообщения редактировать? |
|||
44
Pirate_
23.02.12
✎
13:41
|
Сам запрос SQL и его план. Явно не вижу как тут выкладывать файлы. в SQL я не силен посмотрите пожалуйста.
http://files.mail.ru/VZC1ER |
|||
45
Axel2009
23.02.12
✎
13:43
|
зачем возвращать 800тыс строк клиенту? тормозить будет по любому, потому как транспорт сожрет основное время
|
|||
46
Axel2009
23.02.12
✎
13:46
|
выполни такой код на скуле
set showplan_all on go текст go set showplan_all off там текстовка придет плана, ее проще анализировать, чем xml |
|||
47
Axel2009
23.02.12
✎
13:46
|
где "текст" весь запрос
|
|||
48
Pirate_
23.02.12
✎
13:50
|
План запроса объединения
http://files.mail.ru/I3RGTJ (45) Выполняется на сервере, на клиента ничего не гонится. |
|||
49
Axel2009
23.02.12
✎
13:53
|
(48) "Выполнение запроса возвращает около 800-900 тыс.строк"
транспорт между сервером 1с и скулем тоже есть если что |
|||
50
Pirate_
23.02.12
✎
13:57
|
(49) это понятно, но я не вижу способа от него избавиться или как-то можно напрямую записать в рег сведений?
(46) я в скуле не силен при выполнении просит заполнить переменные условия а как из заполнять я не знаю |
|||
51
Axel2009
23.02.12
✎
14:18
|
(50) тогда профайлер настрой на событие вывода текста плана запроса
|
|||
52
Axel2009
23.02.12
✎
14:20
|
(50) по а) если знать платформу, то вытекает, что запись РС идет поштучно на скульсервер, 800 тыс записей записать разово для скуль сервера - дел не на 6 минут. особенно если там индексы есть. 1ска не предназначена на такую работу
|
|||
53
Axel2009
23.02.12
✎
14:24
|
но в части ускорения запроса: начинаем с начала
убираем всю мутотень с выборами и прочими, убираем помещение во временную таблицу. выбираем только следующее ВЫБРАТЬ НазначениеПравДоступаКСтатьямиСрезПоследних.Пользователь КАК Пользователь, НазначениеПравДоступаКСтатьямиСрезПоследних.Использовать КАК ПравоИспользования, НазначениеПравДоступаКСтатьямиСрезПоследних.Коректировка КАК ПравоКорректировкиЗапросаНарасход, НазначениеПравДоступаКСтатьямиСрезПоследних.СуммаУтверждения КАК ПравоКорректировкиЗапросанаРасходССуммойНеВышеN, НазначениеПравДоступаКСтатьямиСрезПоследних.ПроцентУтверждения КАК ПравоКорректировкиЗапросанаРасходССуммойНеБолееМ, НазначениеПравДоступаКСтатьямиСрезПоследних.ЛюбаяСумма КАК ПравоУтвержденияЗапросаНаРасходСЛюбойСуммой, НазначениеПравДоступаКСтатьямиСрезПоследних.УтверждениеОплаты КАК ПравоУтвержденияОплаты, НазначениеПравДоступаКСтатьямиСрезПоследних.ОтменаРасхода КАК ПравоОтменыРасхода, НазначениеПравДоступаКСтатьямиСрезПоследних.Перераспределение КАК ПравоПерераспределенияВРамкахСтатьи, НазначениеПравДоступаКСтатьямиСрезПоследних.Куратор КАК ПравоКуратора, + Code НазначениеПравДоступаКСтатьямиСрезПоследних.БюджетныйКомитет КАК ПравоБюджетногоКомитета, ЕСТЬNULL(ОбособленныеПодразделенияБанка.Ссылка, НазначениеПравДоступаКСтатьямиСрезПоследних.ПодразделениеБанка) КАК ПодразделениеБанка, ЕСТЬNULL(СтатьиЗатратЦентровОтветственности.Ссылка, НазначениеПравДоступаКСтатьямиСрезПоследних.СтатьяЗатрат) КАК СтатьяЗатрат, ЕСТЬNULL(Проекты.Ссылка, НазначениеПравДоступаКСтатьямиСрезПоследних.Проект) КАК Проект, НазначениеПравДоступаКСтатьямиСрезПоследних.Период КАК Период РегистрСведений.НазначениеПравДоступаКСтатьям.СрезПоследних(&Период, Пользователь = &Пользователь) КАК НазначениеПравДоступаКСтатьямиСрезПоследних ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ОбособленныеПодразделенияБанка КАК ОбособленныеПодразделенияБанка ПО (НазначениеПравДоступаКСтатьямиСрезПоследних.ПодразделениеБанка = ЗНАЧЕНИЕ(Справочник.ОбособленныеПодразделенияБанка.ПустаяСсылка)) ЛЕВОЕ СОЕДИНЕНИЕ Справочник.СтатьиЗатратЦентровОтветственности КАК СтатьиЗатратЦентровОтветственности ПО (НазначениеПравДоступаКСтатьямиСрезПоследних.СтатьяЗатрат = ЗНАЧЕНИЕ(Справочник.СтатьиЗатратЦентровОтветственности.ПустаяСсылка)) И (НазначениеПравДоступаКСтатьямиСрезПоследних.ЦентрОтветственности = СтатьиЗатратЦентровОтветственности.Владелец) ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Проекты КАК Проекты ПО (НазначениеПравДоступаКСтатьямиСрезПоследних.Проект = ЗНАЧЕНИЕ(Справочник.Проекты.ПустаяСсылка)) сколько выборка занимает времени? |
|||
54
Axel2009
23.02.12
✎
16:51
|
вообще проверка траблов транспорта вычисляется следующим способом:
самый последний запрос в пакете сделать ВЫБРАТЬ КОЛИЧЕСТВО(*) ИЗ ПолныйНаборИзмерений КАК ПолныйНаборИзмерений ВНУТРЕННЕЕ СОЕДИНЕНИЕ ПолнаяВыборка КАК ПолнаяВыборка ПО ПолныйНаборИзмерений.Пользователь = ПолнаяВыборка.Пользователь И ПолныйНаборИзмерений.ПодразделениеБанка = ПолнаяВыборка.ПодразделениеБанка И ПолныйНаборИзмерений.СтатьяЗатрат = ПолнаяВыборка.СтатьяЗатрат И ПолныйНаборИзмерений.Проект = ПолнаяВыборка.Проект И ПолныйНаборИзмерений.Период = ПолнаяВыборка.Период И ПолныйНаборИзмерений.Приоритет = ПолнаяВыборка.Приоритет |
|||
55
Pirate_
23.02.12
✎
20:05
|
Спасибо проблема решена! Скуль какого-то х.. делал лишние сортировки без индексов причем в запросе стоит сортировка только конечного результата а в скуле применялось для каждого подзапроса. Убрал сортировки в запросе и сделал пакетную запись. То что выполнялось 2 часа сейчас выполняется 1 мин. Всем спасибо.
|
|||
56
eduspec82
23.02.12
✎
20:17
|
запрос к настройкам прав возвращает 800 - 900 тысяч строк
паранойя |
|||
57
Pirate_
23.02.12
✎
20:27
|
(56) Блин это единоразовая операция для пользователя!!! это не RLS, просто сразу для пользователя в регистре формируется полная матрица прав
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |