“ FETCH API_CURSOR0000 …” มากมายบน sp_WhoIsActive (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_texts "blank" จำนวนมากด้วย สิ่งนี้มีบางอย่างกับ "เคอร์เซอร์" นี้หรือไม่?

ว่างเปล่า

DBCC INPUTBUFFER (spid) แสดงให้ฉันเห็นนี้:

พิมพ์

มีคำถามนี้ที่ นี่ (ทำโดยฉัน) แต่ฉันไม่รู้ว่านี่เป็นสิ่งเดียวกันหรือไม่


EDIT1:

เมื่อใช้เคียวรีที่จัดทำโดยญาติฉันเห็นสิ่งนี้

ยังไม่มีรหัส


EDIT2:

ใช้การตรวจสอบกิจกรรมฉันสามารถเห็นสิ่งนี้:

แบบสอบถามที่มีราคาแพง Mos

มันเป็นข้อความค้นหาที่แพงที่สุด (อันแรกคือเจตนาเรารู้เกี่ยวกับมัน)

และอีกครั้งฉันอยากรู้ว่าทำไมนี่select * from...คือเหตุผลของFETCH CURSOR...


edit3:

" select * from... " นี้กำลังทำงานจากเซิร์ฟเวอร์อื่น (ผ่านlinked server)

ดีตอนนี้ฉันมีปัญหาที่จะเข้าใจสิ่งที่ @kin พูด

นี่คือexecution planแบบสอบถาม (ทำงานในเซิร์ฟเวอร์เดียวกันของฐานข้อมูล):

เซิร์ฟเวอร์เดียวกันของฐานข้อมูล

นี่คือแผนการดำเนินการที่เรียกใช้ในเซิร์ฟเวอร์อื่นผ่านเซิร์ฟเวอร์ที่เชื่อมโยง:

ป้อนคำอธิบายรูปภาพที่นี่

ตกลงไม่เป็นปัญหาเช่นกัน และตอนนี้! แผนการดำเนินการผ่าน**activity monitor**(เดียวกันselect * from):

เกิดอะไรขึ้นที่นี่

คำตอบ:


3

มันเป็นตัวเลือกที่เรียบง่าย ทำไมสิ่งนี้ถึงใช้ fetch_cursor

SELECTเป็นระบบที่สร้างขึ้นโดยกรอบแบบสอบถามกระจายและมีความเกี่ยวข้องกับUPDATEคุณพบ

ผู้ดำเนินการแผนแบบสอบถาม Remote Update ใช้sp_cursorโมเดลเพื่อดึงข้อมูลแถวจากแหล่งข้อมูลระยะไกล นี่คือสาเหตุของการเรียกเคอร์เซอร์ API ทั้งหมด

ฉันเชื่อว่าแผนเคอร์เซอร์ที่คุณแสดงในคำถามของคุณคือเคอร์เซอร์ภายในที่เครื่องยนต์เปิดซึ่งเป็นส่วนหนึ่งของกระบวนการนี้ แต่ฉันยังไม่มีเวลาลองทำสิ่งนี้อีก


1

ดี ... เราแก้ปัญหาได้แล้ว มีการอัปเดตภายในขั้นตอนการทำงานที่ "เลือก * จาก ... " ฉันแสดงความคิดเห็นอัปเดต ไม่มีปัญหาอีกต่อไป


1

นี่อาจเป็นปัญหากับการเรียกใช้ OLEDB ไปยังเซิร์ฟเวอร์ระยะไกล (เซิร์ฟเวอร์ที่เชื่อมโยงและการกำหนดค่า SSIS ใช้ OLEDB)

นี่เป็นข้อบกพร่องในการออกแบบข้อผิดพลาดของ Microsoft SQL Server ที่ไม่ได้รับการแก้ไขจนกว่า SQL Server 2012 SP1 จากสิ่งที่ฉันจำได้ซึ่งมันไม่อนุญาตให้ใช้สถิติระยะไกลเพื่อเพิ่มประสิทธิภาพการสืบค้นจากระยะไกล

คุณจะต้องเรียกใช้ sp_WhoIsActive ( ดาวน์โหลด / เอกสาร ) จากเซิร์ฟเวอร์ REMOTE ในแบบสอบถามเพื่อดูทราฟฟิก แต่ SQL Server ที่ไม่ใช่ 2012 SP1 ไม่อนุญาตให้ใช้สถิติระยะไกลด้วยเหตุผลบางอย่างแม้ว่าการเข้าสู่ระบบจะมีตัวจัดการข้อมูล เข้าถึงตารางทั้งหมดบนเซิร์ฟเวอร์ระยะไกล

โซลูชันของ Microsoft คือการให้สิทธิ์เซิร์ฟเวอร์ที่เชื่อมโยงซึ่งทำให้การโทรระยะไกลมี SA หรือ ddladmin หรือการเข้าถึง DBO ไปยังเซิร์ฟเวอร์ / ตารางระยะไกลที่ถูกสอบถาม

ฉันใช้วิธีนี้เพื่อแก้ไขปัญหานี้ในการตั้งค่าบางอย่างของเราซึ่งโปร่งใสสำหรับวิธีแก้ปัญหาส่วนใหญ่ที่ฉลาดโดยไม่อนุญาตให้ยกระดับสิทธิ์ไปยัง DBs หรือ SQL Servers ทางด้านระยะไกล โดยทั่วไปคุณต้องให้บทบาท ddladmin เข้าสู่ระบบระยะไกลบนฐานข้อมูล SQL Server ระยะไกลที่เป็นปัญหาและสร้างบทบาทที่มีสิทธิ์ DENY อย่างชัดเจนสำหรับการเปลี่ยนแปลงระดับวัตถุหากคุณต้องการอนุญาตการเข้าถึง SELECT เท่านั้น

ด้านล่างนี้เป็นสำเนาของบทบาทฐานข้อมูลคงที่ที่ฉันสร้างขึ้นสำหรับสิ่งนี้ แต่คุณอาจต้องการทดสอบและยืนยันหรือปรับเพิ่มเติมรวมทั้งการอ่านและการวิจัย แต่ได้รับการแก้ไขอย่างโปร่งใสสำหรับฉันในบางกรณี - แคชอาจต้องล้างก่อน โปรดระลึกไว้เสมอและเมื่อลบแล้วให้เรียกใช้สองครั้งและตรวจสอบผลลัพธ์ของกิจกรรมในพื้นที่และกิจกรรมระยะไกล

ดังนั้นอนุญาตให้ข้อมูลประจำตัวของบทบาท ddladmin ในฐานข้อมูลระยะไกลคุณอนุญาตให้สิทธิ์อื่น ๆ ตามปกติบนฐานข้อมูลระยะไกลคุณสร้างบทบาทฐานข้อมูลที่กำหนดเองตามที่ฉันแสดงด้านล่างบนเซิร์ฟเวอร์เดียวกันนี้และจากนั้นคุณเพิ่มข้อมูลประจำตัวเดียวกัน บทบาท 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.