web-dev-qa-db-ja.com

sp_WhoIsActiveでの「FETCH API_CURSOR0000 ...」の多く(SQL Server 2008 R2)

変な状況です。 _sp_whoisactive_を使用してこれを見ることができます:

Strange

わかりました、このクエリを使用して、何がトリガーされているかを確認できます(この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
_

結果:

its just a select

単純なselectです。なぜこれはf _etch_cursor_を使用しているのですか?

また、「空白」のsql_textsもたくさんあります。これはこの「カーソル」に何かありますか?

blank

DBCC INPUTBUFFER (spid)はこれを示しています:

print

この質問があります ここ (私が作成しました)しかし、これが同じことかどうかはわかりません。


EDIT1:

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

still no code.


EDIT2:

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

Mos expensive query

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

そしてもう一度、私は知りたいのですが、なぜこの_select * from..._が_FETCH CURSOR_の理由なのかを...


EDIT3:

この「_select * from_...」は別のサーバーから実行されています(_linked server_を介して)。

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

これは、クエリの_execution plan_です(データベースの同じサーバーで実行されています)。

same server of the database

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

enter image description here

OK、問題ありません。そして今! _**activity monitor**_による実行プラン(同じ_select * from_):

what the hell is going on here?

9
Racer SQL

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

1
Racer SQL

これは単純な選択です。なぜfetch_cursorを使用するのですか?

SELECTは分散クエリフレームワークによってシステムによって生成され、見つかったUPDATEに関連付けられています。

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

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

3
Paul White 9

これは、リモートサーバーへの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
1
Pimp Juice IT