当前位置:数据库 > 数据库管理> 正文

SQL Server中查看未释放的游标

时间:2016-3-15类别:数据库

SQL Server中查看未释放的游标

SQL Server中查看未释放的游标

SQL SERVER提供了一个动态管理函数sys.dm_exec_cursors,返回有关在数据库中打开的游标的信息。

 

一、语法

dm_exec_cursors (session_id | 0 )


 

二、参数说明

session_id | 0:会话的 ID。

1、如果指定了 session_id,则此函数返回有关指定会话中游标的信息。

2、如果指定了 0,则此函数返回有关所有会话的所有游标的信息。

 

 

三、返回的字段名说明

 

列名

数据类型

说明

session_id

int

持有此游标的会话 ID。

cursor_id

int

游标对象的 ID。

name

nvarchar(256)

用户定义的游标名称。

属性

nvarchar(256)

指定游标的属性。  下列属性的值连在一起可构成此列的值:  

  • 声明接口

  • 游标类型

  • 游标并发

  • 游标范围

  • 游标嵌套级别

例如,在此列中返回的值可能为 TSQL | Dynamic | Optimistic | Global (0)。

sql_handle

varbinary(64)

声明游标的批处理的文本句柄。

statement_start_offset

int

在当前正在执行的批处理或存储过程中,指示当前正在执行的语句开始位置的字符数。  可以与 sql_handlestatement_end_offset 和 sys.dm_exec_sql_text 动态管理函数一起使用,以便为请求检索当前正在执行的语句。  

statement_end_offset

int

在当前正在执行的批处理或存储过程中,指示当前正在执行的语句结束位置的字符数。  可以与 sql_handlestatement_start_offsetsys.dm_exec_sql_text 动态管理函数一起使用,以便为请求检索当前正在执行的语句。  

plan_generation_num

bigint

可用于在重新编译后区分不同计划实例的序列号。

creation_time

datetime

创建此游标时的时间戳。

is_open

bit

指定游标是否处于打开状态。

is_async_population

bit

指定后台线程是否仍异步填充 KEYSET 或 STATIC 游标。

is_close_on_commit

bit

指定是否使用 CURSOR_CLOSE_ON_COMMIT 声明游标。

1 = 事务结束时将关闭游标。

fetch_status

int

返回游标的上一提取状态。  这是上次返回的 @@FETCH_STATUS 值。  

fetch_buffer_size

int

返回有关提取缓冲区大小的信息。

1 = Transact-SQL 游标。  对于 API 游标,可以将该参数设置为更高的值。  

fetch_buffer_start

int

对于 FAST_FORWARD 和 DYNAMIC 游标,如果游标未打开或被放在第一行之前,则该参数返回 0。  否则,返回 -1。  

对于 STATIC 和 KEYSET 游标,如果游标未打开,则该参数返回 0;如果游标放在最后一行之外,则该参数返回 -1。

在其他情况下,该参数返回游标所在的行号。

ansi_position

int

游标在提取缓冲区中的位置。

worker_time

bigint

辅助线程执行此游标所用的时间(毫秒)。

reads

bigint

游标所执行的读取次数。

Writes

bigint

游标所执行的写入次数。

dormant_duration

bigint

自上次对此游标启动查询(打开或提取)以来所经过的时间(毫秒)。

 

四、查询没有关闭的游标

需要对字段is_open进行过滤(指定游标是否处于打开状态。1为打开,0表示关闭)

 

  •  
  • SQL 代码   复制
  • 
    SELECT  session_id ,
            cursor_id ,
            name ,
            creation_time ,
            is_open
    FROM    sys.dm_exec_cursors(0)
    WHERE   is_open = 1;
    
    		
  •  

    结果如图

     

     

    五、已经关闭,但是没有释放的游标

     

  • 过滤 is_open=0
  •  
  •  
  •  
  • SQL 代码   复制
  • 
    SELECT  session_id ,
            cursor_id ,
            name ,
            creation_time ,
            is_open
    FROM    sys.dm_exec_cursors(0)
    WHERE   is_open = 0;
    
    		
  •  

    六、查看服务器上打开时间超过指定时间(1 小时)的游标的信息

     

  •  
  •  
  • SQL 代码   复制
  • 
    SELECT   creation_time
            ,cursor_id 
            ,name 
            ,c.session_id 
            ,login_name 
            ,c.creation_time 
            ,c.is_open
    FROM    sys.dm_exec_cursors (0) AS c
            JOIN sys.dm_exec_sessions AS s ON c.session_id = s.session_id
    WHERE   DATEDIFF(hh, c.creation_time, GETDATE()) > 1;
    GO
    
    		
  •  

    标签:
    上一篇下一篇

    猜您喜欢

    热门推荐