Имя: Пароль:
1C
 
Поменял в стандартном RLS шаблоне, профайлер засветился предупреждениями
0 Fragster
 
гуру
09.04.15
13:10
Поменял в стандартном RLS шаблоне, профайлер засветился предупреждениями об использовании темпДБ на промежуточных операциях, хотя вроде все быстро стало. поменял вот что:

почти в начале типовых шаблонов:


Истина В
(   // Проверка права пользователя на текущую таблицу в целом.
    // Права на таблицы формируются по составу ролей профиля группы доступа.
    Выбрать Первые 1 Истина
    ИЗ
        Справочник.ИдентификаторыОбъектовМетаданных КАК СвойстваТекущейТаблицы
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ГруппыДоступа КАК ГруппыДоступа
        ПО
              СвойстваТекущейТаблицы.ПолноеИмя = "#Параметр(1)"
            И Истина В
              (
                Выбрать Первые 1 Истина
                ИЗ
                    РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступа
                    ГДЕ
                          ТаблицыГруппДоступа.Таблица       = СвойстваТекущейТаблицы.Ссылка
                        И ТаблицыГруппДоступа.ГруппаДоступа = ГруппыДоступа.Ссылка
                    #Если НЕ "#Параметр(2)" = "Чтение" #Тогда
                        И ТаблицыГруппДоступа.#Параметр(2)
                    #КонецЕсли
              )
            И ГруппыДоступа.Ссылка В
              (
                Выбрать
                    ГруппыДоступаПользователи.Ссылка КАК ГруппаДоступа
                ИЗ
                    Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступаПользователи
                    ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
                    ПО
                          СоставыГруппПользователей.Используется
                    #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда
                        И СоставыГруппПользователей.Пользователь = &ТекущийПользователь
                    #Иначе
                        И СоставыГруппПользователей.Пользователь = &ТекущийВнешнийПользователь
                    #КонецЕсли
                        И СоставыГруппПользователей.ГруппаПользователей = ГруппыДоступаПользователи.Пользователь
              )
    ГДЕ
          ( // Поиск значений заданных полей в группах доступа (пользователей) по заданным видам доступа.



на


    Выбрать Первые 1 Истина
    ИЗ
        Справочник.ИдентификаторыОбъектовМетаданных КАК СвойстваТекущейТаблицы
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступа
            ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ГруппыДоступа.Пользователи КАК ГруппыДоступа
                ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
                ПО
                      СоставыГруппПользователей.Используется
                #Если &ТекущийВнешнийПользователь = Значение(Справочник.ВнешниеПользователи.ПустаяСсылка) #Тогда
                    И СоставыГруппПользователей.Пользователь = &ТекущийПользователь
                #Иначе
                    И СоставыГруппПользователей.Пользователь = &ТекущийВнешнийПользователь
                #КонецЕсли
                    И СоставыГруппПользователей.ГруппаПользователей = ГруппыДоступа.Пользователь
            ПО ТаблицыГруппДоступа.ГруппаДоступа = ГруппыДоступа.Ссылка
        ПО ТаблицыГруппДоступа.Таблица       = СвойстваТекущейТаблицы.Ссылка
            И СвойстваТекущейТаблицы.ПолноеИмя = "#Параметр(1)"
            #Если НЕ "#Параметр(2)" = "Чтение" #Тогда
                И ТаблицыГруппДоступа.#Параметр(2)
            #КонецЕсли
    ГДЕ
          ( // Поиск значений заданных полей в группах доступа (пользователей) по заданным видам доступа.




в типовой версии вот этот кусок из плана запроса:
http://snag.gy/mE3eu.jpg

а у меня - вот:
http://snag.gy/gw1u2.jpg

статистику 100500 раз обновлял - все равно estimated и actual number of executions у поддерева как расходились, так и расходятся в сотню раз.

Вопрос вот в чем - чем грозит моё изменение (не будет ли провалов по производительности в каких-то случаях, а то и неверной работы)?

И если не стращно - кому не западло - проверьте у себя эффект?

Может можно еще эффективнее без изменения типовой структуры RLS сделать? (с изменениями - понятно, делаем денормализацию и кучу подписок для заполнения денормализованных данных, но это долго писать и отлаживать, во много мест залезать надо).
1 Fragster
 
гуру
09.04.15
13:28
только у меня RLS тормозит, чтоли?
2 Fragster
 
гуру
09.04.15
13:46
или никто стандартными шаблонами не пользуется?
3 Гёдза
 
09.04.15
13:54
что поменял в двух словах
4 Гёдза
 
09.04.15
13:55
сделай картинку 1с ного сравнения файлов
5 EugeniaK
 
09.04.15
14:02
(0) Не могу понять в чем смысл изменения.
Словами напиши.
6 Fragster
 
гуру
09.04.15
14:41
(3)(5) заменил соединение с условием соединения-подзапросами (по ... и истина в (выбрать первые истина из ....)) на соединение с теми таблицами, по которым идет отбор в тех самых подзапросах
+ избавился от одного соединения
7 Fragster
 
гуру
09.04.15
14:43
если чем-то поможет сравнение, то вот (хотя в (0) лучше видно):http://snag.gy/UdTrI.jpg
8 Гёдза
 
09.04.15
14:43
(6) + избавился от одного соединения
А зря )))
9 Гёдза
 
09.04.15
14:44
у тебя появились вложенные соединения
10 Гёдза
 
09.04.15
14:45
а раньше был коррелированный запрос в условии
11 Fragster
 
гуру
09.04.15
14:45
ну или вот так: было слева, стало справа:

http://snag.gy/tagTs.jpg
12 Гёдза
 
09.04.15
14:46
получается что сервер скл лучше разворачивает такие запросы чем ты )))
13 Fragster
 
гуру
09.04.15
14:46
(12) т.е. то, что вместо 6 секунд стало 0.3 - это "сервер 1с лучше разворачивает"?
14 Гёдза
 
09.04.15
14:47
ребилд индексов когда делал последний раз?
15 Fragster
 
гуру
09.04.15
14:48
(14) в ночь на понедельник
16 Гёдза
 
09.04.15
14:49
непонятно из (0) на какой операции конкретно ошибается
17 Fragster
 
гуру
09.04.15
14:50
ГруппыДоступа.Ссылка В
              (
                Выбрать

SORT 22%
18 Fragster
 
гуру
09.04.15
14:50
(17) + на первой картинке плана
19 Гёдза
 
09.04.15
14:51
вообще все запутал
20 Fragster
 
гуру
09.04.15
14:54
(19) кусок из того, что было: ГруппыДоступа.Ссылка В (Выбрать...
это на первой картинке то, что выглядит как sort 22% и внутри вложенное всё. сама табличка Справочник.ГруппыДоступа.Пользователи физически называется dbo._Reference62_VT1104
21 Fragster
 
гуру
09.04.15
14:54
dbo._InfoRg2967 - это РегистрСведений.СоставыГруппПользователей
22 Fragster
 
гуру
09.04.15
14:56
dbo._Reference62 это соответственно Справочник.ГруппыДоступа (от которого там потом в шаблоне используется ссылка)
23 H A D G E H O G s
 
09.04.15
15:22
(0) Что тебя пугает?

"предупреждениями об использовании темпДБ"- это
Row Count Spool - помещение в ТемпДБ данных о количестве строк, без самих данных - ерунда.

Расхождение реальности и предположения - это серьезней. Я даже не знаю, что сказать - я бы воспроизвел бы это на простенькой табличке без обновленной статистики, так чтобы было расхождение "в сотни раз", залез бы в статистику и посмотрел (попробовал бы посмотреть) как работает оптимизатор.
24 Fragster
 
гуру
09.04.15
15:25
(23) там на sort во многих случаях вылезло:
Operator used tempdb to spill data during execution with spill level 1
25 Fragster
 
гуру
09.04.15
15:34
ну и в куче мест estimated number of executions и of rows в десятки и сотни раз различаются. регламенты настроены в соответствии с http://kb.1c.ru/articleView.jsp?id=13 , у базы стоит автообновление статистики
26 H A D G E H O G s
 
09.04.15
15:37
(25) Найди табличку, а которой estimated number of rows отличается в десятки раз и посмотри ее статистику глазами.
27 Fragster
 
гуру
09.04.15
15:42
(26) эта подойдет? http://snag.gy/dICTk.jpg
28 H A D G E H O G s
 
09.04.15
15:43
(27) Да
29 Fragster
 
гуру
09.04.15
15:43
или тут причина в number of executions, которая из другого места вылезает? а как это место найти проще? может он на nesttd loops косячит где-то
30 H A D G E H O G s
 
09.04.15
15:44
Нет, не подходит, ты прав в (29)
31 H A D G E H O G s
 
09.04.15
15:45
Фактически строк 28, ожидаемо 19
32 H A D G E H O G s
 
09.04.15
15:45
Ищем того, кто заставил выполняться 250 раз
33 Fragster
 
гуру
09.04.15
15:54
(32) похожа на эту: http://snag.gy/h6FWa.jpg
однако пишет, что статистика типа актуальна (это РС составы групп пользователей, там никого сегодня не добавлялось) http://snag.gy/YwXbM.jpg
34 H A D G E H O G s
 
09.04.15
15:59
(33) Посмотри его статистику
36 Fragster
 
гуру
09.04.15
16:04
(34) http://pastebin.com/unn0LGv3
конкретно в этом запросе:

Seek Keys[1]: Prefix: [Streloy_Copy].[dbo].[_InfoRg2935]._Fld185; [Streloy_Copy].[dbo].[_InfoRg2935]._Fld2938; [Streloy_Copy].[dbo].[_InfoRg2935]._Fld2936_TYPE; [Streloy_Copy].[dbo].[_InfoRg2935]._Fld2936_RTRef; [Streloy_Copy].[dbo].[_InfoRg2935]._Fld2936_RRRef; [Streloy_Copy].[dbo].[_InfoRg2935]._Fld2937_TYPE; [Streloy_Copy].[dbo].[_InfoRg2935]._Fld2937_RTRef; [Streloy_Copy].[dbo].[_InfoRg2935]._Fld2937_RRRef = Scalar Operator([@P6]); Scalar Operator(0x01); Scalar Operator([Streloy_Copy].[dbo].[_Reference62_VT1104].[_Fld1106_TYPE] as [T7].[_Fld1106_TYPE]); Scalar Operator([Streloy_Copy].[dbo].[_Reference62_VT1104].[_Fld1106_RTRef] as [T7].[_Fld1106_RTRef]); Scalar Operator([Streloy_Copy].[dbo].[_Reference62_VT1104].[_Fld1106_RRRef] as [T7].[_Fld1106_RRRef]); Scalar Operator(0x08); Scalar Operator(0x0000002A); Scalar Operator([@P2])
37 Fragster
 
гуру
09.04.15
16:09
(35) а?
38 H A D G E H O G s
 
09.04.15
16:24
(37) Я счаст сам разбираюсь.
39 Гёдза
 
09.04.15
16:30
а как вообще определяется приблизительное число рядов?
40 Гёдза
 
09.04.15
16:34
41 Fragster
 
гуру
09.04.15
16:46
для шаблона #ПоЗначениям когда на таблицу документа накладывается условие по реквизиту на который натравлены РЛС по группам доступа

вот этот кусок:

            Выбрать Первые 1 Истина
            ИЗ РегистрСведений.ГруппыЗначенийДоступа КАК ГруппыЗначений
                Внутреннее Соединение РегистрСведений.ЗначенияГруппДоступа КАК Значения
                ПО
                      ГруппыЗначений.ВидДоступа      = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6))
                    И ГруппыЗначений.ЗначениеДоступа = #Параметр(7)
                    И Значения.ГруппаДоступа         = ГруппыДоступа.Ссылка
                    И Значения.ВидДоступа            = Значение(ПланВидовХарактеристик.ВидыДоступа.#Параметр(6))
                    И Значения.ТолькоВидДоступа      = ГруппыЗначений.ТолькоВидДоступа
                    И Значения.ЗначениеДоступа       = ГруппыЗначений.ГруппаЗначенийДоступа

по РегистрСведений.ЗначенияГруппДоступа дает косяк http://snag.gy/vOWSs.jpg
42 Fragster
 
гуру
10.04.15
11:33
На боевом режиме изменения из (0) почему-то периодически скатывается в скан по Справочник.ГруппыДоступа.Пользователи, откатил назад.

надо понять, как оптимизатору намекнуть на расхождения в актуальных и предполагаемых данных...