Sql-Server-2008

sp_WhoIsActive(SQL Server 2008 R2)上有很多“FETCH API_CURSOR0000 …”

  • May 13, 2020

我有一個奇怪的情況。使用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 提供的查詢,我看到:

仍然沒有程式碼。


編輯2:

使用活動監視器,我可以看到:

最昂貴的查詢

這是最昂貴的查詢(第一個是故意的,我們知道)。

再說一次,我想知道,為什麼這select * from...FETCH CURSOR…的原因


編輯3:

此“ select * from…”正在從另一台伺服器(通過linked server)執行。

好吧,現在我很難理解@kin 所說的內容。

這是execution plan查詢的(在數據庫的同一台伺服器上執行):

數據庫的同一台伺服器

這是現在,通過連結伺服器在另一台伺服器上執行的執行計劃:

在此處輸入圖像描述

好的,也不是問題。現在!執行計劃,通過**activity monitor**(相同select * from):

這到底是怎麼回事?

嗯…我們解決了這個問題。在執行“select * from …”的程序內有一個更新。我評論了更新。沒有更多的問題。

這是一個簡單的選擇。為什麼要使用 fetch_cursor?

是分佈式查詢框架系統生成的SELECT,並與UPDATE您找到的相關聯。

Remote Update 查詢計劃運算符使用該sp_cursor模型從遠端數據源中獲取行。這是所有游標 API 呼叫的原因。

我相信您在問題中顯示的游標計劃是引擎在此過程中打開的內部游標,但我還沒有時間嘗試重現這一點。

引用自:https://dba.stackexchange.com/questions/110784