変な状況です。 _sp_whoisactive
_を使用してこれを見ることができます:
わかりました、このクエリを使用して、何がトリガーされているかを確認できます(このWordは英語で存在しますか?)
_SELECT c.session_id, c.properties, c.creation_time, c.is_open, t.text
FROM sys.dm_exec_cursors (SPID) c --0 for all cursors running
CROSS APPLY sys.dm_exec_sql_text (c.sql_handle) t
_
結果:
単純なselect
です。なぜこれはf _etch_cursor
_を使用しているのですか?
また、「空白」のsql_textsもたくさんあります。これはこの「カーソル」に何かありますか?
DBCC INPUTBUFFER (spid)
はこれを示しています:
この質問があります ここ (私が作成しました)しかし、これが同じことかどうかはわかりません。
EDIT1:
Kinが提供するクエリを使用すると、次のようになります。
EDIT2:
アクティビティモニターを使用して、これを確認できます。
これは最も高価なクエリです(最初のクエリは意図的なものであり、それについては知っています)。
そしてもう一度、私は知りたいのですが、なぜこの_select * from...
_が_FETCH CURSOR
_の理由なのかを...
EDIT3:
この「_select * from
_...」は別のサーバーから実行されています(_linked server
_を介して)。
さて、@ kinが言ったことを理解するのに問題があります。
これは、クエリの_execution plan
_です(データベースの同じサーバーで実行されています)。
これはリンクサーバー経由で他のサーバーで実行される実行プランです。
OK、問題ありません。そして今! _**activity monitor**
_による実行プラン(同じ_select * from
_):
さて...私たちは問題を解決しました。 「select * from ...」を実行するプロシージャ内に更新がありました。更新についてコメントしました。これ以上の問題はありません。
これは単純な選択です。なぜfetch_cursorを使用するのですか?
SELECT
は分散クエリフレームワークによってシステムによって生成され、見つかったUPDATE
に関連付けられています。
リモート更新クエリプランオペレーターはsp_cursor
リモートデータソースから行をフェッチするモデル。これがすべてのカーソルAPI呼び出しの原因です。
あなたの質問に示したカーソルプランは、このプロセスの一部としてエンジンによって開かれた内部カーソルであると思いますが、これを再現する時間はまだありません。
これは、リモートサーバーへのOLEDB呼び出しの問題である可能性があります(リンクサーバーとSSIS構成はOLEDBを使用します)。
これは設計上の欠陥であり、Microsoft SQL Serverのバグであり、SQL Server 2012 SP1までパッチが適用されていなかったため、リモート統計を使用してクエリをリモートで最適化することはできません。
クエリでREMOTEサーバーからsp_WhoIsActive( download | docs )を実行してトラフィックを確認する必要がありますが、2012 SP1ではないSQL Serverは許可しませんログインにリモートサーバー上のすべてのテーブルへのデータリーダーアクセスがある場合でも、何らかの理由でリモート統計の使用。
Microsoftのソリューションは、リモート呼び出しを行うリンクサーバーの資格情報にSA、ddladmin、または照会されるリモートサーバー/テーブルへのDBOアクセスを許可することです。
私はこれを使用して、リモート側のDBまたはSQL Serverへの昇格されたアクセス許可を許可することなく、ほとんどのソリューションで透過的なセットアップの一部でこの問題を回避しました。基本的に、問題のリモートSQL Server DBにリモートログインddladminロールを付与し、SELECTアクセスのみを許可する場合は、オブジェクトレベルの変更に対する明示的なDENY権限を持つロールを作成する必要があります。
以下は、私がこのために作成したカスタムDB固定ロールのコピーですが、テストおよび確認または調整に加えて、いくつかの読み取りと調査が必要になる場合がありますが、場合によっては透過的に解決されます-機能する前にキャッシュをクリアする必要がある場合がありますこの点に注意してください。クリアされたら、2回実行して、ローカルアクティビティとリモートアクティビティの両方で結果を確認してください。
したがって、リモートDBでddladminロールの認証情報を許可し、リモートDBで他の通常の権限を許可し、この同じサーバーで以下にリストするようにカスタムDBロールを作成し、その新しいカスタム固定に同じ認証情報を追加します明示的な拒否を伴うDBロールは、キャッシュをクリアし、キャッシュをクリアした後にクエリを2回以上実行して、解決されるかどうかを確認します。
SQL Server 2012 SP1より前のバージョンを実行していて、これを表示していて、リモートクエリを実行している場合、使用またはリモートを許可しないため、これらのカーソルフェッチが表示されるという理由で具体的に質問に答えます。このセットアップの統計(回避策なし)(上記のとおり)の場合、クエリは最適なクエリプランの統計を使用して最適化されておらず、カーディナリティの問題があるため、前述のKinのように行ごとの処理を行います。
/*
CREATE A NEW ROLE - Deny explicit DB object access for linked
server credentials that the DDLAdmin role gives which is needed
for DBCC SHOW_STATISTICS across linked servers
*/
-- Database specific
CREATE ROLE db_LinkedServer_Restriction
DENY ALTER ANY Assembly TO db_LinkedServer_Restriction
DENY ALTER ANY ASYMMETRIC KEY TO db_LinkedServer_Restriction
DENY ALTER ANY CERTIFICATE TO db_LinkedServer_Restriction
DENY ALTER ANY CONTRACT TO db_LinkedServer_Restriction
DENY ALTER ANY DATABASE DDL TRIGGER TO db_LinkedServer_Restriction
DENY ALTER ANY DATABASE EVENT NOTIFICATION TO db_LinkedServer_Restriction
DENY ALTER ANY DATASPACE TO db_LinkedServer_Restriction
DENY ALTER ANY FULLTEXT CATALOG TO db_LinkedServer_Restriction
DENY ALTER ANY MESSAGE TYPE TO db_LinkedServer_Restriction
DENY ALTER ANY REMOTE SERVICE BINDING TO db_LinkedServer_Restriction
DENY ALTER ANY ROUTE TO db_LinkedServer_Restriction
DENY ALTER ANY SCHEMA TO db_LinkedServer_Restriction
DENY ALTER ANY SERVICE TO db_LinkedServer_Restriction
DENY ALTER ANY SYMMETRIC KEY TO db_LinkedServer_Restriction
DENY CHECKPOINT TO db_LinkedServer_Restriction
DENY CREATE AGGREGATE TO db_LinkedServer_Restriction
DENY CREATE DEFAULT TO db_LinkedServer_Restriction
DENY CREATE FUNCTION TO db_LinkedServer_Restriction
DENY CREATE PROCEDURE TO db_LinkedServer_Restriction
DENY CREATE QUEUE TO db_LinkedServer_Restriction
DENY CREATE RULE TO db_LinkedServer_Restriction
DENY CREATE SYNONYM TO db_LinkedServer_Restriction
DENY CREATE TABLE TO db_LinkedServer_Restriction
DENY CREATE TYPE TO db_LinkedServer_Restriction
DENY CREATE VIEW TO db_LinkedServer_Restriction
DENY CREATE XML SCHEMA COLLECTION TO db_LinkedServer_Restriction
DENY REFERENCES TO db_LinkedServer_Restriction
GO