Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Алексаша Member Откуда: Левый берег Сообщений: 407 |
Здравствуйте ! ms sql server 2008 Есть процедура долго выполняемая под пользователем роли паблик (4 сек), под админом практически мгновенно. Задался вопросом почему .... Эта процедура (№1) содержит в себе выполнение еще процедуры (№2), которая содержит динамический запрос, при пошаговом выполнении тормоз в несколько секунд происходит при выполнение №2 именно в месте выполнения динам. запроса и почему то только под ограниченным пользователем. Отмечу что по тексту процедур алгоритм выполнения для пользов. админ и паблик не отличается. Хотел выложить листинг динам. запроса ... Но выявил еще один факт процедура №2 если ее выполнить самостоятельно под пользов. паблик вообще не тормозит => дело не в кодинге этого динам. запроса. Вопрос 1) почему разница по времени в выполнении процедуры №1 для пользов. с разными правами ? 2) почему для огранич. пользователя выполнение проц. №2 в обход №1 происходит мгновенно, а через №1 4 сек. ? Спасибо большое ... |
7 июн 16, 15:28 [19267567] Ответить | Цитировать Сообщить модератору |
AlanDenton Member [скрыт] Откуда: Сообщений: 1004 |
План выполнения бы показали... под обоими пользователями |
7 июн 16, 15:31 [19267587] Ответить | Цитировать Сообщить модератору |
Алексаша Member Откуда: Левый берег Сообщений: 407 |
Планы читать не умею. На скринах они идентичны. Разница только во времени выполнения К сообщению приложен файл. Размер - 118Kb |
7 июн 16, 15:44 [19267659] Ответить | Цитировать Сообщить модератору |
Алексаша Member Откуда: Левый берег Сообщений: 407 |
И вот медленный план К сообщению приложен файл. Размер - 146Kb |
7 июн 16, 15:45 [19267666] Ответить | Цитировать Сообщить модератору |
AlanDenton Member [скрыт] Откуда: Сообщений: 1004 |
Вернуть identity колонку так быстрее будет:SELECT @AutoIDField = c.name FROM sys.columns c WHERE c.object_id = OBJECT_ID('dbo.tbl', 'U') AND c.is_identity = 1 Ок... Можно полный запрос показать? Метаданные я люблю :) |
7 июн 16, 15:50 [19267705] Ответить | Цитировать Сообщить модератору |
Владислав Колосов Member Откуда: Сообщений: 8316 |
Вы дали паблику CONTROL, ALTER или VIEW DEFINITION ? Wow! |
7 июн 16, 16:22 [19267858] Ответить | Цитировать Сообщить модератору |
Алексаша Member Откуда: Левый берег Сообщений: 407 |
Владислав Колосов, VIEW DEFINITION у паблика такого разрешения нет. Есть разрешение на выполнение процедуры №1. Последняя в свою очередь вызывает процедуру №2, для выполнения кот. необх. VIEW DEFINITION поэтому процедура № 2 вызывается в другом контексте (если я правильно использую терминологию). EXECUTE AS SELF |
7 июн 16, 18:09 [19268316] Ответить | Цитировать Сообщить модератору |
Алексаша Member Откуда: Левый берег Сообщений: 407 |
AlanDenton, Завтра полный запрос. Надеюсь поможете. |
7 июн 16, 18:15 [19268338] Ответить | Цитировать Сообщить модератору |
Алексаша Member Откуда: Левый берег Сообщений: 407 |
Продолжаем разговор ... Процедура №1 проверяет условие возможности редактирования записи, если не прошло 24 часов с момента вставки записи. Для этого процедура №1 обращается в своем теле к процедуре №2 кот. умеет достать лог изменений указанной таблицы. данные об изменении записей таблице хранятся в таблице с полем типа XML Процедура №1
Процедура №2
Повторюсь ... под админ выполняется мгновенно. Под пабликом процедура №1 3-4 секунды. При пошаговом выполнении некий тормоз приходится в месте EXEC (@SQL) - процедура №2. И в тоже время если выполнить напрямую №2 под пабликом то мгновенно. Сообщение было отредактировано: 8 июн 16, 10:29 |
||
8 июн 16, 09:14 [19269529] Ответить | Цитировать Сообщить модератору |
Алексаша Member Откуда: Левый берег Сообщений: 407 |
Владислав Колосов, Ваш вопрос должен был меня сразу направить в решение ... но. Проблему решил. Она была логическая чтоли ... В процедуре №1 есть запрос к метаданным кот. паблику не доступны => процедура №2 вызывалась с аргументом NULL что и приводило к большим затратам ... |
8 июн 16, 11:32 [19270305] Ответить | Цитировать Сообщить модератору |
Владислав Колосов Member Откуда: Сообщений: 8316 |
Алексаша, SELF давать рискованно, т.к. принципал-создатель может быть удален, отключен и прочее вместе с именем входа. Лучше создайте пользователя без логина (или с привязкой к сертификату) и ему выдайте требуемые права вместе с явным EXECUTE AS. |
8 июн 16, 12:17 [19270617] Ответить | Цитировать Сообщить модератору |
Алексаша Member Откуда: Левый берег Сообщений: 407 |
Владислав Колосов, спасибо, учту. |
8 июн 16, 13:44 [19271185] Ответить | Цитировать Сообщить модератору |
AlanDenton Member [скрыт] Откуда: Сообщений: 1004 |
Примерно как-то так... Хотя если честно, это упростить бы не мешало.
|
|
8 июн 16, 14:01 [19271291] Ответить | Цитировать Сообщить модератору |
Алексаша Member Откуда: Левый берег Сообщений: 407 |
Владислав Колосов, Спасибо за советы Ваш вариант лаконичнее чтоли, более удобочитаем. Но не получается рабочим в этом месте. Ниже приведеный часть кода дает результат длины и для целочисленных типов. SELECT @Схема = '(' + (SELECT c.name + ' ' + TYPE_NAME(c.system_type_id) + ISNULL('(' + CAST(c.max_length AS VARCHAR(10)) + ')', '') + ', ' FROM sys.columns c WHERE c.[object_id] = @object_id AND ( @ВозвратитьПоля IS NULL OR c.column_id IN (SELECT * FROM @ids) ) FOR XML PATH ('')) + ' DateTimeStamp DateTime, HostName VARCHAR(100), UserLogin VARCHAR(100), Op TINYINT)' Результат (id int(4), name varchar(300) .....) Нужно (id int, name varchar(300) .....) Т.е. длину указывать только для символьных типов Подскажите. Спасибо. |
9 июн 16, 09:18 [19274358] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |