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


9

我有一个奇怪的情况。使用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:

使用活动监视器,可以看到以下内容:

Mos昂贵的查询

这是最昂贵的查询(第一个查询是有意的,我们知道)。

再一次,我想知道,为什么这select * from...FETCH CURSOR... 的原因


编辑3:

此“ select * from...”正在从另一台服务器(通过linked server)运行。

好吧,现在我在理解@kin所说的内容时遇到了问题。

这是execution plan查询的查询(在数据库的同一服务器上运行):

数据库的同一服务器

现在,这是通过链接服务器在另一台服务器中运行的执行计划:

在此处输入图片说明

好的,这也不是问题。现在!通过**activity monitor**(相同select * from)执行计划:

这到底是怎么回事?

Answers:


3

这是一个简单的选择。为什么使用fetch_cursor?

SELECT是系统生成的由分布式查询框架,并与相关的UPDATE你发现了。

远程更新查询计划操作员使用该sp_cursor模型从远程数据源中获取行。这是所有游标API调用的原因。

我相信您在问题中显示的游标计划是引擎在此过程中打开的内部游标,但是我还没有时间尝试重现此游标。


1

OLEDB调用远程服务器(链接的服务器和SSIS配置使用OLEDB)可能是一个问题。

这是一个设计缺陷,是Microsoft SQL Server的一个错误,直到我记起SQL Server 2012 SP1时才修复,该错误不允许远程统计信息用于远程优化查询。

您还需要在查询中从REMOTE服务器运行sp_WhoIsActive(下载 | docs)以查看通信量,但是非2012 SP1的SQL Server出于某种原因也不允许使用远程统计信息,即使登录名具有数据读取器也是如此访问远程服务器上的所有表。

Microsoft解决方案是授予链接服务器凭据,以使进行远程调用的SA或ddladmin或DBO可以访问要查询的远程服务器/表。

我用它来解决某些设置中的此问题,这在大多数情况下是透明的,而不允许对远程数据库或SQL Server具有更高的权限。基本上,您只需要在有问题的远程SQL Server DB上授予远程登录ddladmin角色,然后如果仅打算允许SELECT访问,则为对象级别更改创建一个具有明确的DENY权限的角色。

以下是我为此创建的自定义数据库固定角色的副本,但您可能需要测试和确认或进一步调整,再进行一些阅读和研究,但在某些情况下对我透明解决-可能需要清除缓存才能运行请记住这一点,将其清除后,运行两次,并检查本地活动和远程活动的结果。

因此,在远程数据库上授予凭据ddladmin角色,在远程数据库上授予其他常规权限,在同一服务器上创建我在下面列出的自定义数据库角色,然后将该相同的凭据添加到已修复的新自定义中具有明确拒绝的数据库角色,清除缓存,在清除缓存后查看查询是否可以解决,然后运行查询两次或更多次。

为了特定地回答您的问题,但是由于您看到这些游标的原因,如果您正在运行低于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

好吧...我们解决了这个问题。运行的过程内部有一个“选择*从...中”的更新。我评论了更新。没有更多的问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.