シナリオ:SQL Server 2014(v12.0.4100.1)
.NETサービスはこのクエリを実行します。
SELECT name, base_object_name
FROM sys.synonyms
WHERE schema_id IN (SELECT schema_id
FROM sys.schemas
WHERE name = N'XXXX')
ORDER BY name
...約6500行を返しますが、3分以上経過するとタイムアウトすることがよくあります。XXXX
上記はありません「DBO」。
SSMSでこのクエリをUserAとして実行すると、クエリは1秒未満で返されます。
UserB(.NETサービスの接続方法)として実行すると、クエリは3〜6 分かかり、CPU使用率は(4コアの)25%になります。
UserAは、sysadminロールのドメインログインです。
UserBはSQLログインです。
EXEC sp_addrolemember N'db_datareader', N'UserB'
EXEC sp_addrolemember N'db_datawriter', N'UserB'
EXEC sp_addrolemember N'db_ddladmin', N'UserB'
GRANT EXECUTE TO [UserB]
GRANT CREATE SCHEMA TO [UserB]
GRANT VIEW DEFINITION TO [UserB]
上記のSQLをExecute as...Revert
ブロックでラップすることでSSMSでこれを複製できるので、.NETコードは見えません。
実行計画は同じに見えます。XMLを比較したところ、わずかな違い(CompileTime、CompileCPU、CompileMemory)しかありませんでした。
IO Statsはすべて物理的な読み取りを示していません
テーブル 'sysobjvalues'。スキャンカウント0、論理読み取り19970、物理読み取り0、先読み読み取り0、LOB論理読み取り0、LOB物理読み取り0、LOB先読み読み取り0。 テーブル「ワークファイル」。スキャンカウント0、論理読み取り0、物理読み取り0、先読み読み取り0、LOB論理読み取り0、LOB物理読み取り0、LOB先読み読み取り0。 テーブル「ワークテーブル」。スキャンカウント0、論理読み取り0、物理読み取り0、先読み読み取り0、LOB論理読み取り0、LOB物理読み取り0、LOB先読み読み取り0。 テーブル 'sysschobjs'。スキャンカウント1、論理読み取り9122、物理読み取り0、先読み読み取り0、lob論理読み取り0、lob物理読み取り0、lob先読み読み取り0。 テーブル 'sysclsobjs'。スキャンカウント0、論理読み取り2、物理読み取り0、先読み読み取り0、lob論理読み取り0、lob物理読み取り0、lob先読み読み取り0。
XEventの待機ステータス(〜3分のクエリの場合)は次のとおりです。
+ --------------------- + ------------ + -------------- -------- + ------------------------------ + ---------- ------------------- + | 待機タイプ| 待機数| 合計待機時間(ミリ秒)| 合計リソース待機時間(ミリ秒)| 合計信号待機時間(ミリ秒)| + --------------------- + ------------ + -------------- -------- + ------------------------------- + --------- -------------------- + | SOS_SCHEDULER_YIELD | 37300 | 427 | 20 | 407 | | NETWORK_IO | 5 | 26 | 26 | 0 | | IO_COMPLETION | 3 | 1 | 1 | 0 | + --------------------- + ------------ + -------------- -------- + ------------------------------- + --------- -------------------- +
クエリを書き換えると(SSMSでは、アプリコードにアクセスできません)、次のようになります。
declare @id int
SELECT @id=schema_id FROM sys.schemas WHERE name = N'XXXX'
SELECT a.name, base_object_name FROM sys.synonyms a
WHERE schema_id = @id
ORDER BY name
次に、UserBはUserAと同じ(高速)速度で実行されます。
db_owner
UserB に追加すると、クエリは1秒未満で実行されます。
このテンプレートを介して作成されたスキーマ:
DECLARE @TranName VARCHAR(20)
SELECT @TranName = 'MyTransaction'
BEGIN TRANSACTION @TranName
GO
IF NOT EXISTS (SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA
WHERE SCHEMA_NAME = '{1}')
BEGIN
EXEC('CREATE SCHEMA [{1}]')
EXEC sp_addextendedproperty @name='User', @value='{0}', @level0type=N'Schema', @level0name=N'{1}'
END
GO
{2}
COMMIT TRANSACTION MyTransaction;
GO
そして、{2}は、そのスキーマで作成されたシノニムのリストだと思います。
クエリへの2つのポイントでのクエリプロファイル:
マイクロソフトでチケットをオープンしました。
また、UserBをdb_owner
に追加して、にDENY
関連付けられていることがわかっているすべての特権を使用してみましたdb_owner
。結果は高速なクエリです。何かを逃した(完全に可能)か、db_owner
役割の特別なチェックがあります。