sp_WhoIsActive의 많은“FETCH API_CURSOR0000…”(SQL Server 2008 R2)


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_text도 볼 수 있습니다. 이 "커서"와 관련이 있습니까?

공백

DBCC INPUTBUFFER (spid) 나에게 이것을 보여줍니다 :

인쇄

거기에이 질문 여기에 (나를 만든이)하지만이 같은 일이 나도 몰라.


편집 1 :

kin이 제공 한 쿼리를 사용하면 다음과 같습니다.

여전히 코드가 없습니다.


EDIT2 :

Activity Monitor를 사용하면 다음을 볼 수 있습니다.

이끼 비싼 쿼리

가장 비싼 쿼리입니다 (첫 번째 쿼리는 의도적입니다, 우리는 그것에 대해 알고 있습니다).

그리고 다시, 나는이 이유를 알고 싶다 select * from...의 이유 FETCH CURSOR...


EDIT3 :

이 " select * from..."이 (가 linked server) 다른 서버에서 실행 중입니다 .

글쎄, 이제 @kin이 말한 것을 이해하는 데 문제가 있습니다.

이것은 execution plan쿼리와 같습니다 (데이터베이스의 동일한 서버에서 실행 중).

데이터베이스의 동일한 서버

이것은 이제 연결된 서버를 통해 다른 서버에서 실행되는 실행 계획입니다.

여기에 이미지 설명을 입력하십시오

좋아, 문제도 아니다. 그리고 지금! 비아 실행 계획 **activity monitor**(동일한 select * from)

대체 무슨 일이 일어나고 있는거야?

답변:


3

간단한 선택입니다. 왜 fetch_cursor를 사용합니까?

이것은 SELECT분산 쿼리 프레임 워크에 의해 시스템 생성되며 UPDATE찾은 것과 연관 됩니다.

원격 업데이트 쿼리 계획 연산자는 sp_cursor모델을 사용 하여 원격 데이터 원본에서 행을 가져옵니다. 이것이 모든 커서 API 호출의 원인입니다.

귀하의 질문에 표시하는 커서 계획은이 프로세스의 일부로 엔진에 의해 열린 내부 커서이지만 아직 재현 할 시간이 없었습니다.


1

글쎄 ... 우리는 문제를 해결했다. "select * from ..."를 실행하는 프로 시저 내에 업데이트가있었습니다. 업데이트에 댓글을 달았습니다. 더 이상 문제가 없습니다.


1

이는 원격 서버에 대한 OLEDB 호출에서 문제가 될 수 있습니다 (링크 된 서버 및 SSIS 구성은 OLEDB를 사용함).

이것은 SQL Server 2012 SP1까지 원격 통계를 사용하여 쿼리를 원격으로 최적화하는 데 사용할 수없는 곳에서 패치하지 않은 디자인 결함 인 Microsoft SQL Server 버그입니다.

트래픽을 확인하려면 쿼리의 REMOTE 서버에서 sp_WhoIsActive ( download / docs ) 를 실행 하고 트래픽을 확인해야하지만 2012 SP1이 아닌 SQL Server는 로그인에 데이터 리더가 있어도 어떤 이유로 든 원격 통계 사용을 허용하지 않습니다. 원격 서버의 모든 테이블에 액세스합니다.

Microsoft 솔루션은 원격 서버 호출에 원격 서버 / 테이블에 대한 SA 또는 ddladmin 또는 DBO 액세스 권한을 갖도록 연결된 서버 자격 증명을 부여하는 것입니다.

필자는 원격에서 DB 또는 SQL Server에 대한 높은 권한을 허용하지 않고 대부분의 솔루션에 투명한 투명한 일부 설정 에서이 문제를 해결하는 데 사용했습니다. 기본적으로 해당 원격 SQL Server DB에 대한 원격 로그인 ddladmin 역할을 부여한 다음 SELECT 액세스 만 허용하려는 경우 개체 수준 변경에 대한 명시 적 DENY 권한이있는 역할을 만들어야합니다.

아래는 내가 이것을 위해 만든 커스텀 DB 고정 역할의 사본이지만 더 읽기 및 연구와 함께 테스트하고 확인하거나 조정하고 싶지만 경우에 따라 투명하게 해결 될 수 있습니다. 캐시가 작동하기 전에 지워야 할 수도 있습니다 이것을 명심하고 일단 지워지면 두 번 실행하고 로컬 활동과 원격 활동 모두 결과를 확인하십시오.

따라서 원격 DB에서 자격 증명 ddladmin 역할을 허용하고, 원격 DB에 대한 다른 일반적인 권한을 허용하고,이 동일한 서버에서 아래에 나열된대로 사용자 지정 DB 역할을 생성 한 다음 동일한 새 자격 증명에 동일한 자격 증명을 추가합니다. 명시 적 거부가있는 DB 역할은 캐시를 지우고 캐시를 지운 후 쿼리를 두 번 이상 실행하여 해결되는지 확인합니다.

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.