sp_WhoIsActive(SQL Server 2008 R2)上有很多“FETCH API_CURSOR0000 …”
我有一個奇怪的情況。使用
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
. 為什麼使用 fetch_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 呼叫的原因。我相信您在問題中顯示的游標計劃是引擎在此過程中打開的內部游標,但我還沒有時間嘗試重現這一點。