Sp_WhoIsActive üzerinde çok sayıda “FETCH API_CURSOR0000…” (SQL Server 2008 R2)


9

Tuhaf bir durumum var. Kullanarak sp_whoisactivebunu görebilirsiniz:

Garip

Tamam, bu sorgu ile, tetikleyen ne olduğunu görebilirsiniz (bu kelime İngilizce olarak mevcut mu?):

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

sonuç:

bu sadece bir seçim

bu basit select. Bu neden f kullanıyor etch_cursor?

Ayrıca, bir sürü "boş" sql_texts görüyorum. Bu "imleç" ile ilgili bir şey var mı?

boş

DBCC INPUTBUFFER (spid) bana bunu gösterir:

Yazdır

Orada bu soru İşte (tarafımdan yapılmış) ama bu aynı şey olup olmadığını bilmiyorum.


Edit1:

Kin tarafından sağlanan sorguyu kullanarak, şunu görüyorum:

hala kod yok.


EDIT2:

Etkinlik İzleyicisi'ni kullanarak şunu görebilirim:

Mos pahalı sorgu

En pahalı sorgu (Birincisi kasıtlı, bunu biliyoruz).

Ve yine, bu yüzden, bilmek istiyorum select * from...sebebi ise FETCH CURSOR...


EDIT3:

Bu " select * from..." başka bir sunucudan (üzerinden linked server) çalışıyor.

Şimdi @kin'in ne dediğini anlamakta sorun yaşıyorum.

Bu execution plansorgunun (veritabanının aynı sunucu çalışan) arasında:

veritabanının aynı sunucusu

bu, diğer sunucuda bağlı sunucu üzerinden çalışan yürütme planıdır:

resim açıklamasını buraya girin

Tamam, sorun da değil. Ve şimdi! yürütme planı, **activity monitor**(aynı select * from) aracılığıyla :

Burada ne oluyor yahu?

Yanıtlar:


3

Basit bir seçim. Bu neden fetch_cursor kullanıyor?

SELECTSistem tarafından oluşturulan dağıtılmış sorgu çerçevesi gereğidir ve ilişkili UPDATEBulduğunuz.

Uzaktan Güncelleme sorgu planı işleci sp_cursor, uzak veri kaynağından satır almak için modeli kullanır . Tüm imleç API çağrılarının nedeni budur.

Sorunuzda gösterdiğiniz imleç planının, bu işlemin bir parçası olarak motor tarafından açılan dahili imleç olduğuna inanıyorum, ancak henüz yeniden üretmeye çalışacak vaktim olmadı.


1

Şey ... Sorunu çözdük. "" Seçen * "seçen yordamın içinde bir Güncelleme vardı. Güncellemeyi yorumladım. daha fazla sorun yok.


1

Uzak sunuculara OLEDB çağrılarıyla ilgili bir sorun olabilir (bağlı sunucular ve SSIS yapılandırmaları OLEDB kullanır).

Bu, bir tasarım kusuru, SQL Server 2012 SP1'e kadar yamayı hatırlamadığım yerden uzak istatistiklerin sorguyu uzaktan optimize etmek için kullanılmasına izin vermediği noktaya kadar yamalanmamış Microsoft SQL Server hatasıdır.

Trafiği görmek için sorgudaki REMOTE sunucusundan da sp_WhoIsActive ( indirme / dokümanlar ) çalıştırmanız gerekir , ancak 2012 SP1 olmayan SQL Server, oturum açmada veri okuyucu olsa bile bazı nedenlerden dolayı uzak istatistiklerin kullanılmasına izin vermez uzak sunucudaki tüm tablolara erişim.

Microsoft çözümü, uzak çağrının sorgulanan uzak sunucu / tablolara SA veya ddladmin veya DBO erişimi olmasını sağlayan bağlı sunucu kimlik bilgisini vermektir.

Bunu, uzak taraftaki DB'lere veya SQL Server'lara yükseltilmiş izinlere izin vermeden çoğunlukla çözüm açısından şeffaf olan bazı kurulumlarımızda bu sorunu çözmek için kullandım. Temel olarak, uzak SQL Server DB üzerinde uzak oturum açma ddladmin rolünü vermeniz ve sonra yalnızca SELECT erişimine izin vermek istiyorsanız nesne düzeyi değişiklikleri için açık DENY izinleriyle bir rol oluşturmanız gerekir.

Aşağıda bunun için oluşturduğum özel DB sabit rolünün kopyası var, ancak test etmek ve onaylamak veya daha fazla artı okuma ve araştırma ayarlamak isteyebilir, ancak bazı durumlarda benim için şeffaf bir şekilde çözülmüş olabilir - önbellek işe yaramadan önce temizlenmelidir. bunu aklınızda bulundurun ve temizlendikten sonra, iki kez çalıştırın ve sonuçlar için hem yerel etkinliği hem de uzak etkinliği kontrol edin.

Bu yüzden, uzak DB'deki ddladmin rolünün kimlik bilgisine izin verin, uzak DB'deki diğer olağan izinlere izin verin, aynı sunucuda aşağıda listelediğim gibi özel DB rolünü oluşturursunuz ve daha sonra aynı kimlik bilgisini bu yeni özel düzeltmeye eklersiniz Açık reddedilen DB rolü, önbelleği temizler, çözülüp çözülmediğini görmek için önbelleği temizledikten sonra sorguyu iki veya daha fazla kez çalıştırın.

SQL Server 2012 SP1'in altında bir sürüm çalıştırıyorsanız ve bunu görüyorsanız ve uzak bir sorgu çalıştırıyorsanız, kullanıma veya uzaktan kumandaya izin vermediğinden, bu imleç getirmelerini görmenizin nedeni nedeniyle sorunuzu özellikle yanıtlamak için Bu kurulumdaki istatistikleri bir geçici çözüm olmadan (yukarıda listelendiği gibi), daha sonra sorgu en iyi sorgu planı için istatistikler kullanılarak optimize edilmediğinden ve kardinalite sorununa sahip olduğundan, yukarıda belirtilen Kin olarak satır satır işlem yapar.

/* 
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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.