Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Разная скорость выполнения запросов в зависимости от прав  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
Добрый день, коллеги.

Предыстория.
Миграция с SQL Server 2005 Standart Edition на SQL Server 2012 Enterprise Edition вызвала серьёзные проблемы с производительностью учетной системы (самописной на Access). Ковырялся, ковырялся, драйвера меняли, режимы совместимости, колдовали-шаманили, в общем всё, что можно и нельзя пытались сделать - проблема сохраняется.

Суть проблемы.
Есть запросец:
select object_name(id), user_name(uid), type, ObjectProperty(id, N'IsMSShipped') from sysobjects where type in (N'U', N'S') and permissions(id) & 4096 <> 0 
go

Данный селект выполняет Access при подключении к рабочей БД, отловил профайлером. Т.е. это самое первое, что выполняется когда юзер запускает рабочую БД.

Скорость выполнения данного запроса разнится от наличия/отсутствия прав.

В БД создана роль для программистов db_Programmers, которая даёт возможность изменять, удалять и т.д. практически все объекты. Но на sysobjects никаких спец.прав не назначено.

Даём db_Programmers: менее одной секунды.

Забираем db_Programmers: 4 секунды.

Планы выполнения - полностью идентичны.

С db_Programmers:
  
|--Filter(WHERE:([Expr1030]<>(0) AND has_access('MO',[Stock2].[sys].[sysschobjs].[id])=(1)))
       |--Compute Scalar(DEFINE:([Expr1012]=CONVERT(char(2),CASE WHEN [Stock2].[sys].[sysschobjs].[type]='UQ' THEN 'K' ELSE CASE WHEN [Stock2].[sys].[sysschobjs].[type]='PK' THEN 'K' ELSE CONVERT(char(2),[Stock2].[sys].[sysschobjs].[type],0) END END,0), [Expr1023]=object_name([Stock2].[sys].[sysschobjs].[id]), [Expr1024]=user_name(CONVERT_IMPLICIT(int,CONVERT(smallint,[Stock2].[sys].[sysschobjs].[nsid],0),0)), [Expr1025]=objectproperty([Stock2].[sys].[sysschobjs].[id],'IsMSShipped'), [Expr1030]=permissions([Stock2].[sys].[sysschobjs].[id])&(4096)))
            |--Clustered Index Scan(OBJECT:([Stock2].[sys].[sysschobjs].[clst]), WHERE:([Stock2].[sys].[sysschobjs].[nsclass]=(0) AND [Stock2].[sys].[sysschobjs].[pclass]=(1) AND (CONVERT_IMPLICIT(nchar(2),CONVERT(char(2),CASE WHEN [Stock2].[sys].[sysschobjs].[type]='UQ' THEN 'K' ELSE CASE WHEN [Stock2].[sys].[sysschobjs].[type]='PK' THEN 'K' ELSE CONVERT(char(2),[Stock2].[sys].[sysschobjs].[type],0) END END,0),0)=N'S' OR CONVERT_IMPLICIT(nchar(2),CONVERT(char(2),CASE WHEN [Stock2].[sys].[sysschobjs].[type]='UQ' THEN 'K' ELSE CASE WHEN [Stock2].[sys].[sysschobjs].[type]='PK' THEN 'K' ELSE CONVERT(char(2),[Stock2].[sys].[sysschobjs].[type],0) END END,0),0)=N'U')))


Без db_Programmers:

  |--Filter(WHERE:([Expr1030]<>(0) AND has_access('MO',[Stock2].[sys].[sysschobjs].[id])=(1)))
       |--Compute Scalar(DEFINE:([Expr1012]=CONVERT(char(2),CASE WHEN [Stock2].[sys].[sysschobjs].[type]='UQ' THEN 'K' ELSE CASE WHEN [Stock2].[sys].[sysschobjs].[type]='PK' THEN 'K' ELSE CONVERT(char(2),[Stock2].[sys].[sysschobjs].[type],0) END END,0), [Expr1023]=object_name([Stock2].[sys].[sysschobjs].[id]), [Expr1024]=user_name(CONVERT_IMPLICIT(int,CONVERT(smallint,[Stock2].[sys].[sysschobjs].[nsid],0),0)), [Expr1025]=objectproperty([Stock2].[sys].[sysschobjs].[id],'IsMSShipped'), [Expr1030]=permissions([Stock2].[sys].[sysschobjs].[id])&(4096)))
            |--Clustered Index Scan(OBJECT:([Stock2].[sys].[sysschobjs].[clst]), WHERE:([Stock2].[sys].[sysschobjs].[nsclass]=(0) AND [Stock2].[sys].[sysschobjs].[pclass]=(1) AND (CONVERT_IMPLICIT(nchar(2),CONVERT(char(2),CASE WHEN [Stock2].[sys].[sysschobjs].[type]='UQ' THEN 'K' ELSE CASE WHEN [Stock2].[sys].[sysschobjs].[type]='PK' THEN 'K' ELSE CONVERT(char(2),[Stock2].[sys].[sysschobjs].[type],0) END END,0),0)=N'S' OR CONVERT_IMPLICIT(nchar(2),CONVERT(char(2),CASE WHEN [Stock2].[sys].[sysschobjs].[type]='UQ' THEN 'K' ELSE CASE WHEN [Stock2].[sys].[sysschobjs].[type]='PK' THEN 'K' ELSE CONVERT(char(2),[Stock2].[sys].[sysschobjs].[type],0) END END,0),0)=N'U')))


PRINT @@VERSION
/*

Microsoft SQL Server 2012 (SP1) - 11.0.3128.0 (X64) 
	Dec 28 2012 20:23:12 
	Copyright (c) Microsoft Corporation
	Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)
*/


Есть у кого мыслишки на эту тему? Серьёзно, уже ппц мозг плывёт.

Резюме: очень прошу помощи в подсказке мне, чайнику, хотя б в какую сторону копать... Спасибо!) И всех с наступающими!)
---------------------
Серж аКа k[AD]u
30 апр 14, 10:31    [15956569]     Ответить | Цитировать Сообщить модератору
 Re: Разная скорость выполнения запросов в зависимости от прав  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
Прежде чем публиковать пост, я покурил поиск по форуму, какие варианты находил, пускал в тестирование.. Проблема сохраняется.
30 апр 14, 10:34    [15956591]     Ответить | Цитировать Сообщить модератору
 Re: Разная скорость выполнения запросов в зависимости от прав  [new]
Гадя Петрович
Member

Откуда: планета Плюк, 215 в тентуре, галактика Кин-дза-дза в Спирали
Сообщений: 52912
а схему если указать?
sys.sysobjects
30 апр 14, 10:46    [15956690]     Ответить | Цитировать Сообщить модератору
 Re: Разная скорость выполнения запросов в зависимости от прав  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
Гадя Петрович,

Не помогает :(
30 апр 14, 10:50    [15956723]     Ответить | Цитировать Сообщить модератору
 Re: Разная скорость выполнения запросов в зависимости от прав  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
with x as
(
 select top (2147483648)
  object_name(object_id) as object_name,
  user_name(principal_id) as user_name,
  type,
  ObjectProperty(object_id, N'IsMSShipped') as IsMSShipped,
  permissions(object_id) as p
from
 sys.all_objects
where
 type in (N'U', N'S')
)
select
 object_name, user_name, type, IsMSShipped
from
 x
where
 p & 4096 <> 0;
30 апр 14, 13:14    [15957996]     Ответить | Цитировать Сообщить модератору
 Re: Разная скорость выполнения запросов в зависимости от прав  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
Установил следующее:
Если пользователю дать привелегию CONTROL ON SCHEMA::dbo - то запрос отрабатывается быстро.
Если пользователю назначить все права на схему (SELECT, INSERT, TAKE OWNERSHIP...) то запрос работает медленно....
В планах запроса ничего не меняется... Результат - одинаковый...

Куда можно дальше копать, ребят??...
7 май 14, 15:45    [15986253]     Ответить | Цитировать Сообщить модератору
 Re: Разная скорость выполнения запросов в зависимости от прав  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
Так не бывает. Надо проверять что включено - аудиты, DDL триггеры...
7 май 14, 16:45    [15986621]     Ответить | Цитировать Сообщить модератору
 Re: Разная скорость выполнения запросов в зависимости от прав  [new]
Зайцев Фёдор
Member

Откуда: Лужки
Сообщений: 5308
Если не секрет, а почему в запросе для SQL Server 2005 и 2012 вообще присутствует обращение к sysobjects?
7 май 14, 16:54    [15986655]     Ответить | Цитировать Сообщить модератору
 Re: Разная скорость выполнения запросов в зависимости от прав  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
Совершенно не секрет: данные запросы отправляет Access при подключении к серверу в проекте ADP, чтобы получить список доступных объектов. Access 2003, 2007, 2010...
7 май 14, 17:05    [15986728]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить