Esto puede ser un problema con las llamadas OLEDB a servidores remotos (los servidores vinculados y las configuraciones SSIS usan OLEDB).
Este es un error de diseño, error de Microsoft SQL Server que no fue parcheado hasta SQL Server 2012 SP1 por lo que recuerdo, donde no permite que se usen estadísticas remotas para optimizar la consulta de forma remota.
Deberá ejecutar sp_WhoIsActive ( descargar | documentos ) desde el servidor REMOTO en la consulta también para ver el tráfico, pero SQL Server que no es 2012 SP1 no permite el uso de estadísticas remotas por alguna razón, incluso si el inicio de sesión tiene un lector de datos acceso a todas las tablas en el servidor remoto.
La solución de Microsoft es otorgar a la credencial del servidor vinculado que la llamada remota tenga acceso SA, o ddladmin o DBO al servidor / tabla (s) remota (s) que se consultan.
Utilicé esto para solucionar este problema en algunas de nuestras configuraciones, que es transparente en su mayor parte en cuanto a la solución, sin permitir permisos elevados para DB o servidores SQL en el lado remoto. Básicamente, debe otorgar la función de inicio de sesión remoto ddladmin en la base de datos remota de SQL Server en cuestión y luego crear una función con permisos explícitos DENY para los cambios a nivel de objeto si solo tiene la intención de permitir el acceso SELECCIONAR.
A continuación se muestra la copia de la función fija de base de datos personalizada que creo para esto, pero es posible que desee probar y confirmar o ajustar más, además de algunas lecturas e investigaciones, pero se resolvió de manera transparente para mí en algunos casos; es posible que el caché necesite borrarse antes de que funcione. tenga esto en cuenta y una vez que se borre, ejecútelo dos veces y verifique la actividad local y la actividad remota para obtener resultados.
Entonces, permita la credencial de la función ddladmin en la base de datos remota, permita los otros permisos habituales en la base de datos remota, cree la función de base de datos personalizada como se enumera a continuación en este mismo servidor y luego agregue esa misma credencial a esa nueva solución personalizada El rol de base de datos con las negaciones explícitas, borra el caché, ejecuta la consulta dos veces o más después de borrar el caché para ver si se resuelve.
Sin embargo, para responder específicamente a su pregunta por la razón por la que está viendo estas recuperaciones de cursor, si está ejecutando una versión por debajo de SQL Server 2012 SP1 y está viendo esto y está ejecutando una consulta remota, porque no permite el uso o estadísticas en esta configuración sin una solución alternativa (como se enumeró anteriormente), luego realiza el procesamiento fila por fila como Kin indicó anteriormente, ya que la consulta no está optimizada usando estadísticas para el mejor plan de consulta y tiene el problema de cardinalidad.
/*
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