SqlServer中查看当前Open的Cursor方法

1. 什么是Cursor

Cursor是一种操作关系型数据库中行的机制。在一些特殊情况下,需要使用一张表的所有记录的数据进行一些处理,而这张表又非常大,无法一次将所有数据都取出来进行处理,这时就需要用到游标。Cursor就是用于存储SQL Select语句返回结果集的临时容器,在需要的时候可以先将结果集存储起来,然后每次取出一行或多行数据进行处理。

1.1 Cursor的优点

1)方便操作Cursor的操作方式与编写传统程序差不多,通过对记录集的遍历,可以很方便的进行数据查找、过滤、排序等。Cursor为开发人员提供了一种极为有效的处理集合数据的机制,还可以通过遍历记录集来处理复杂的联合查询。在遍历记录集期间,可以对每一行记录进行逐行数据操作,实现对表格数据的灵活控制。

2)速度更快在不用Cursor或遍历结果集之前,一般是先将数据取出来,然后再在代码中进行处理。对于需要的所有数据的处理问题,需要大量的知道内存,并且这种方式对于处理大量数据的程序,会导致性能下降。而使用Cursor的处理方式是将数据存储在内存中,然后一条条地取出并进行处理,在时间和空间上都有很大的优势。

1.2 Cursor的缺点

1)消耗资源较多在处理大量数据时,Cursor需要消耗更多的资源和内存,而且因为需要将数据存储在内存中,所以会增加磁盘和CPU的使用率。

2)引发性能问题在大量数据的情况下,查询语句执行时间会变得很长,并且Cursor必须在全局锁定范围内运行,因此,当需要查询并发性能高的系统时,Cursor很可能会引起性能问题。

2. SqlServer中查看当前Open的Cursor方法

在SqlServer中,我们可以使用以下查询语句来查看当前所有Open的Cursor:

SELECT sqltext.TEXT,

req.session_id,

req.status,

req.command,

req.cpu_time,

req.total_elapsed_time

FROM sys.dm_exec_requests req

CROSS APPLY sys.dm_exec_sql_text(sql_handle) AS sqltext

WHERE req.command IN ( 'FETCH API_CURSOR', 'FETCH NEXT FROM API_CURSOR',

'FETCH PRIOR FROM API_CURSOR', 'FETCH RELATIVE FROM API_CURSOR',

'FETCH ABSOLUTE FROM API_CURSOR', 'UPDATE API_CURSOR',

'DELETE API_CURSOR', 'INSERT API_CURSOR' )

上述查询返回了Open SQL Server游标所使用的SESSION_ID、SQL语句、运行状态信息等,使我们可以详细了解游标的使用。

数据库标签