Wiele „FETCH API_CURSOR0000…” na sp_WhoIsActive (SQL Server 2008 R2)

9

Mam dziwną sytuację. Za pomocą sp_whoisactiveWidzę to:

Dziwne

Ok, dzięki temu zapytaniu widzę, co się uruchamia (czy to słowo istnieje w języku angielskim?) To:

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

wynik:

to tylko wybrane

to jest proste select. Dlaczego używasz f etch_cursor?

Widzę też wiele „pustych” tekstów sql. Czy to ma coś z tym „kursorem”?

pusty

DBCC INPUTBUFFER (spid) pokazuje mi to:

wydrukować

jest to pytanie Tutaj (stworzone przeze mnie), ale nie wiem, czy to jest to samo.


EDYCJA 1:

Za pomocą zapytania dostarczonego przez kin widzę to:

wciąż brak kodu.


EDYCJA 2:

Za pomocą Monitora aktywności widzę to:

Mos drogie zapytanie

Jest to najdroższe zapytanie (pierwsze jest celowe, wiemy o tym).

I znowu chciałbym wiedzieć, dlaczego to select * from...jest powód FETCH CURSOR...


EDYCJA 3:

To „ select * from...” działa z innego serwera (przez linked server).

Cóż, teraz mam problemy ze zrozumieniem, co powiedział @kin.

Oto execution planzapytanie (działające na tym samym serwerze bazy danych):

ten sam serwer bazy danych

jest to teraz plan wykonania, działający na innym serwerze za pośrednictwem serwera połączonego:

wprowadź opis zdjęcia tutaj

Ok, to też nie problem. I teraz! plan wykonania za pośrednictwem **activity monitor**(tego samego select * from):

co do diabła się tu wyprawia?

Racer SQL
źródło

Odpowiedzi:

3

To prosty wybór. Dlaczego używa tego fetch_cursor?

SELECTJest systemem generowane przez Distributed ramach zapytań, i jest związany z UPDATEznalazłeś.

Operator planu zapytań o aktualizację zdalną używa sp_cursormodelu do pobierania wierszy ze zdalnego źródła danych. Jest to przyczyną wszystkich wywołań interfejsu API kursora.

Wierzę, że plan kursora, który pokazujesz w swoim pytaniu, to wewnętrzny kursor otwarty przez silnik w ramach tego procesu, ale nie miałem czasu, aby spróbować go odtworzyć.

Paul White 9
źródło
1

Cóż ... Rozwiązaliśmy problem. W trakcie procedury była aktualizacja, która „wybiera * z ...”. Skomentowałem aktualizację. nigdy więcej problemów.

Racer SQL
źródło
1

Może to być problem z połączeniami OLEDB ze zdalnymi serwerami (serwery połączone i konfiguracje SSIS używają OLEDB).

Jest to wada projektowa, błąd Microsoft SQL Server, który nie został załatany aż do SQL Server 2012 SP1 z tego, co pamiętam, w którym nie pozwala on na używanie statystyk zdalnych w celu zdalnej optymalizacji zapytania.

Musisz również uruchomić sp_WhoIsActive ( pobieranie / dokumenty ) z serwera REMOTE w zapytaniu, aby zobaczyć ruch, ale SQL Server, który nie jest SP1 z 2012 r., Z jakiegoś powodu nie pozwala na korzystanie ze zdalnych statystyk, nawet jeśli login ma moduł danych dostęp do wszystkich tabel na zdalnym serwerze.

Rozwiązaniem firmy Microsoft jest przyznanie poświadczeniu połączonego serwera, aby zdalne wywołanie miało dostęp SA, ddladmin lub DBO do zdalnego serwera / tabel, do którego są wysyłane zapytania.

Użyłem tego, aby obejść ten problem w niektórych naszych konfiguracjach, który jest przejrzysty w przeważającej części pod względem rozwiązania, nie zezwalając na podwyższone uprawnienia do baz danych lub serwerów SQL po stronie zdalnej. Zasadniczo musisz przyznać rolę ddladmin do zdalnego logowania na zdalnej bazie danych SQL Server, a następnie utwórz rolę z jawnymi uprawnieniami ODMOWY dla zmian na poziomie obiektu, jeśli tylko chcesz zezwolić na dostęp SELECT.

Poniżej znajduje się kopia niestandardowej ustalonej roli DB, którą dla tego stworzyłem, ale możesz chcieć przetestować i potwierdzić lub dostosować dalej oraz trochę czytania i badań, ale w niektórych przypadkach rozwiązano dla mnie przezroczystość - pamięć podręczna może jednak wymagać wyczyszczenia, zanim zadziała, więc miej to na uwadze, a gdy wszystko zostanie wyczyszczone, uruchom je dwukrotnie i sprawdź wyniki lokalne i zdalne.

Pozwól więc na poświadczenie roli ddladmin na zdalnym DB, zezwolisz na inne zwykłe uprawnienia na zdalnym DB, utworzysz niestandardową rolę DB, jak wymieniłem poniżej na tym samym serwerze, a następnie dodasz tę samą referencję do tej nowej niestandardowej stałej Rola DB z wyraźnym zaprzeczeniem, wyczyść pamięć podręczną, uruchom zapytanie dwukrotnie lub więcej po wyczyszczeniu pamięci podręcznej, aby sprawdzić, czy zostanie rozwiązane.

Aby w szczególności odpowiedzieć na twoje pytanie z tego powodu, że widzisz te pobrania kursora, jeśli używasz wersji poniżej SQL Server 2012 SP1 i widzisz to, a także uruchamiasz zdalne zapytanie, ponieważ nie pozwala ono na użycie ani zdalne statystyki w tym ustawieniu bez obejścia (wymienione powyżej), następnie wykonuje przetwarzanie wiersz po rzędzie, jak podano powyżej Kin, ponieważ zapytanie nie jest zoptymalizowane przy użyciu statystyk dla najlepszego planu zapytań i ma problem z licznością.

/* 
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
Pimp Juice IT
źródło