Banyak "FETCH API_CURSOR0000 ..." di sp_WhoIsActive (SQL Server 2008 R2)


9

Saya memiliki situasi yang aneh. Menggunakan sp_whoisactivesaya bisa melihat ini:

Aneh

Oke, dengan kueri ini, saya dapat melihat apa yang memicu (apakah kata ini ada dalam bahasa Inggris?) Itu:

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

hasil:

itu hanya pilih

itu sederhana select. Mengapa ini menggunakan f etch_cursor?

Juga, saya melihat banyak sql_text "kosong" juga. Apakah ini ada sesuatu dengan "kursor" ini?

kosong

DBCC INPUTBUFFER (spid) tunjukkan ini:

mencetak

ada pertanyaan di sini (dibuat oleh saya) tetapi saya tidak tahu apakah ini hal yang sama.


EDIT1:

Menggunakan kueri yang disediakan oleh kin, saya melihat ini:

masih belum ada kode.


EDIT2:

Menggunakan Monitor Aktivitas, saya bisa melihat ini:

Permintaan mahal

Ini adalah permintaan yang paling mahal (Yang pertama disengaja, kita tahu tentang itu).

Dan lagi, saya ingin tahu, mengapa ini select * from...adalah alasan FETCH CURSOR...


EDIT3:

" select * from..." ini dijalankan dari server lain (via linked server).

Nah, Sekarang saya mengalami masalah untuk memahami apa yang dikatakan @kin.

Ini adalah execution plankueri (berjalan di server database yang sama):

server database yang sama

ini sekarang, rencana eksekusi, berjalan di server lain, melalui server tertaut:

masukkan deskripsi gambar di sini

Ok, tidak masalah juga. Dan sekarang! rencana eksekusi, melalui **activity monitor**(sama select * from):

apa yang sedang terjadi di sini?

Jawaban:


3

Ini adalah pemilihan yang sederhana. Mengapa ini menggunakan fetch_cursor?

Ini SELECTdihasilkan sistem oleh kerangka kerja Kueri Terdistribusi, dan dikaitkan dengan yang UPDATEAnda temukan.

Operator paket kueri Pembaruan Jarak Jauh menggunakan sp_cursormodel untuk mengambil baris dari sumber data jarak jauh. Ini adalah penyebab dari semua panggilan API kursor.

Saya percaya rencana kursor yang Anda tunjukkan dalam pertanyaan Anda adalah kursor internal yang dibuka oleh mesin sebagai bagian dari proses ini, tetapi saya belum punya waktu untuk mencoba mereproduksi ini.


1

Ini mungkin masalah dengan panggilan OLEDB ke server jauh (server yang ditautkan dan konfigurasi SSIS menggunakan OLEDB).

Ini adalah cacat desain, bug Microsoft SQL Server yang tidak ditambal hingga SQL Server 2012 SP1 dari apa yang saya ingat di mana tidak memungkinkan statistik jarak jauh digunakan untuk mengoptimalkan kueri dari jarak jauh.

Anda perlu menjalankan sp_WhoIsActive ( unduh | docs ) dari server REMOTE dalam kueri juga untuk melihat lalu lintas, tetapi SQL Server yang bukan 2012 SP1 tidak mengizinkan penggunaan statistik jarak jauh untuk beberapa alasan bahkan jika login memiliki datareader akses ke semua tabel di server jarak jauh.

Solusi Microsoft adalah untuk memberikan kredensial server yang ditautkan membuat panggilan jarak jauh untuk memiliki SA, atau ddladmin, atau akses DBO ke server / tabel jarak jauh yang ditanyai.

Saya menggunakan ini untuk menyelesaikan masalah ini di beberapa pengaturan kami yang transparan untuk sebagian besar solusi bijaksana tanpa mengizinkan izin tinggi untuk DB atau SQL Server di sisi jarak jauh. Anda pada dasarnya perlu memberikan peran ddladmin login jarak jauh pada SQL Server DB jarak jauh yang bersangkutan, dan kemudian membuat peran dengan izin DENY eksplisit untuk perubahan tingkat objek jika Anda hanya bermaksud untuk mengizinkan akses SELECT.

Di bawah ini adalah salinan dari peran tetap DB kustom yang saya buat untuk ini, tetapi Anda mungkin ingin menguji dan mengkonfirmasi atau menyesuaikan lebih lanjut ditambah beberapa bacaan dan penelitian tetapi diselesaikan secara transparan untuk saya dalam beberapa kasus - cache mungkin perlu dibersihkan meskipun sebelum bekerja begitu ingatlah hal ini dan setelah dibersihkan, jalankan dua kali dan periksa baik aktivitas lokal maupun aktivitas jarak jauh untuk hasilnya.

Jadi izinkan kredensial peran ddladmin pada DB jarak jauh, Anda mengizinkan izin biasa lainnya pada DB jarak jauh, Anda membuat peran DB kustom seperti yang saya cantumkan di bawah di server yang sama ini, dan kemudian Anda menambahkan kredensial yang sama ke kustom baru yang diperbaiki Peran DB dengan penyangkalan eksplisit, kosongkan cache, jalankan kueri dua kali atau lebih setelah membersihkan cache untuk melihat apakah itu terselesaikan.

Untuk menjawab pertanyaan Anda secara khusus karena alasan Anda melihat kursor ini diambil, jika Anda menjalankan versi di bawah SQL Server 2012 SP1 dan melihatnya dan Anda menjalankan kueri jarak jauh, karena itu tidak memungkinkan penggunaan atau jarak jauh. statistik dalam pengaturan ini tanpa penyelesaian (seperti yang tercantum di atas), maka ia melakukan pemrosesan baris-demi-baris seperti yang dinyatakan Kin karena kueri tidak dioptimalkan menggunakan statistik untuk rencana kueri terbaik dan memiliki masalah kardinalitas.

/* 
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

Yah ... Kami memecahkan masalahnya. Ada Pembaruan, di dalam prosedur yang menjalankan "pilih * dari ...". Saya berkomentar pembaruan. tidak ada lagi masalah.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.