sp_WhoIsActive上の「FETCH API_CURSOR0000…」が多数(SQL Server 2008 R2)


9

変な状況です。これsp_whoisactiveを見ることができる使用:

奇妙な

わかりました、このクエリを使用して、何がトリガーされているかを確認できます(この単語は英語で存在しますか?)それ:

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) これを私に示します:

印刷する

ここに私が作った質問があり ますが、これが同じことかどうかはわかりません。


編集1:

kinが提供するクエリを使用すると、次のようになります。

まだコードはありません。


EDIT2:

アクティビティモニターを使用して、これを確認できます。

Mosの高いクエリ

これは最も負荷の高いクエリです(最初のクエリは意図的なものであり、私たちはそれについて知っています)。

繰り返しますが、なぜこれselect * from...が理由なのかを知りたいのFETCH CURSORですが...


EDIT3:

この " select * from..."は別のサーバーから(経由でlinked server)実行されています。

さて、@ kinが言ったことを理解するのに問題があります。

これはexecution planクエリの(データベースの同じサーバーで実行されている)です。

データベースの同じサーバー

これは、リンクサーバー経由で他のサーバーで実行されている実行プランです。

ここに画像の説明を入力してください

OK、問題ありません。そしていま!**activity monitor**(同じselect * from)を介した実行計画:

ここで何が起こっているのですか?

回答:


3

簡単な選択です。なぜfetch_cursorを使用しているのですか?

SELECTシステムが生成した分散クエリフレームワークであり、かつ関連付けられているUPDATEあなたが見つけました。

リモート更新クエリプランオペレーターは、sp_cursorモデルを使用してリモートデータソースから行をフェッチします。これがすべてのカーソルAPI呼び出しの原因です。

あなたの質問に示したカーソルプランは、このプロセスの一部としてエンジンによって開かれた内部カーソルであると思いますが、これを再現する時間はまだありません。


1

これは、リモートサーバーへのOLEDB呼び出しの問題である可能性があります(リンクサーバーとSSIS構成はOLEDBを使用します)。

これは設計上の欠陥であり、Microsoft SQL Serverのバグであり、SQL Server 2012 SP1までパッチが適用されなかったため、リモートの統計を使用してクエリをリモートで最適化することはできません。

クエリでREMOTEサーバーからsp_WhoIsActive(ダウンロード | 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

1

さて...私たちは問題を解決しました。「select * from ...」を実行するプロシージャ内に更新がありました。更新についてコメントしました。これ以上の問題はありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.