Rất nhiều API FETCH API_CURSOR0000 Bố trí trên sp_WhoIsActive (SQL Server 2008 R2)


9

Tôi có một tình huống kỳ lạ. Sử dụng sp_whoisactivetôi có thể thấy điều này:

Lạ

Ok, với truy vấn này, tôi có thể thấy những gì đang kích hoạt (từ này có tồn tại trong tiếng Anh không?) Nó:

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

kết quả:

nó chỉ là một lựa chọn

đó là một đơn giản select. Tại sao điều này sử dụng f etch_cursor?

Ngoài ra, tôi cũng thấy rất nhiều sql_texts "trống". Cái này có cái gì với "con trỏ" này không?

chỗ trống

DBCC INPUTBUFFER (spid) cho tôi thấy điều này:

in

Có câu hỏi này ở đây (do tôi thực hiện) nhưng tôi không biết liệu đây có phải là điều tương tự không.


EDIT1:

Sử dụng truy vấn được cung cấp bởi kin, tôi thấy điều này:

vẫn không có mã.


EDIT2:

Sử dụng Activity Monitor, tôi có thể thấy điều này:

Mos truy vấn đắt tiền

Đó là truy vấn đắt nhất (Câu hỏi đầu tiên là có chủ ý, chúng tôi biết về nó).

Và một lần nữa, tôi muốn biết, tại sao đây select * from...là lý do của FETCH CURSOR...


EDIT3:

" select * from..." này đang chạy từ một máy chủ khác (thông qua linked server).

Chà, bây giờ tôi đang gặp vấn đề để hiểu những gì @kin nói.

Đây là execution plantruy vấn (chạy trong cùng một máy chủ của cơ sở dữ liệu):

cùng một máy chủ của cơ sở dữ liệu

bây giờ, kế hoạch thực hiện, đang chạy trong máy chủ khác, thông qua máy chủ được liên kết:

nhập mô tả hình ảnh ở đây

Ok, không phải là một vấn đề quá. Và bây giờ! kế hoạch thực hiện, thông qua **activity monitor**(giống nhau select * from):

cái quái gì đang diễn ra ở đây vậy?

Câu trả lời:


3

Đó là một lựa chọn đơn giản. Tại sao điều này sử dụng fetch_c tiền?

Các SELECTlà hệ thống được tạo ra bởi khuôn khổ Query Distributed, và được kết hợp với UPDATEbạn được tìm thấy.

Toán tử kế hoạch truy vấn Cập nhật từ xa sử dụng sp_cursormô hình để tìm nạp các hàng từ nguồn dữ liệu từ xa. Đây là nguyên nhân của tất cả các lệnh gọi API con trỏ.

Tôi tin rằng kế hoạch con trỏ bạn hiển thị trong câu hỏi của bạn là con trỏ bên trong được mở bởi công cụ như một phần của quy trình này, nhưng tôi chưa có thời gian để thử tái tạo điều này.


1

Đây có thể là một vấn đề với các cuộc gọi OLEDB đến các máy chủ từ xa (các máy chủ được liên kết và cấu hình SSIS sử dụng OLEDB).

Đây là một lỗi thiết kế, lỗi Microsoft SQL Server chưa được vá cho đến khi SQL Server 2012 SP1 từ những gì tôi nhớ lại khi nó không cho phép các số liệu thống kê từ xa được sử dụng để tối ưu hóa truy vấn từ xa.

Bạn sẽ cần phải chạy sp_WhoIsActive ( tải về | docs ) từ máy chủ REMOTE trong truy vấn cũng như để xem lưu lượng, nhưng SQL Server đó không phải là 2012 SP1 không cho phép việc sử dụng số liệu thống kê từ xa đối với một số lý do ngay cả khi đăng nhập có datareader truy cập vào tất cả các bảng trên máy chủ từ xa.

Giải pháp của Microsoft là cấp thông tin xác thực cho máy chủ được liên kết để thực hiện cuộc gọi từ xa để có SA, hoặc ddladmin hoặc DBO truy cập vào máy chủ / bảng từ xa được truy vấn.

Tôi đã sử dụng điều này để giải quyết vấn đề này trong một số thiết lập của chúng tôi, đó là minh bạch cho phần lớn giải pháp khôn ngoan mà không cho phép nâng cao quyền đối với DB hoặc Máy chủ SQL ở phía xa. Về cơ bản, bạn cần phải cấp vai trò ddladmin đăng nhập từ xa trên SQL Server DB từ xa, và sau đó tạo một vai trò với quyền DENY rõ ràng cho các thay đổi cấp đối tượng nếu bạn chỉ có ý định cho phép truy cập CHỌN.

Dưới đây là bản sao của vai trò cố định DB tùy chỉnh mà tôi tạo cho việc này nhưng bạn có thể muốn kiểm tra và xác nhận hoặc điều chỉnh thêm cộng với một số đọc và nghiên cứu nhưng đã giải quyết trong suốt cho tôi trong một số trường hợp - bộ đệm có thể cần được xóa mặc dù trước khi nó hoạt động Hãy ghi nhớ điều này và một khi nó bị xóa, hãy chạy nó hai lần và kiểm tra cả hoạt động cục bộ và hoạt động từ xa để biết kết quả.

Vì vậy, hãy cho phép thông tin xác thực vai trò ddladmin trên DB từ xa, bạn cho phép các quyền thông thường khác trên DB từ xa, bạn tạo vai trò DB tùy chỉnh như tôi đã liệt kê bên dưới trên cùng máy chủ này và sau đó bạn thêm thông tin xác thực đó vào tùy chỉnh mới đó Vai trò DB với các từ chối rõ ràng, xóa bộ đệm, chạy truy vấn hai lần trở lên sau khi xóa bộ đệm để xem nó có giải quyết được không.

Để trả lời cụ thể câu hỏi của bạn mặc dù vì lý do bạn thấy các con trỏ này tìm nạp, nếu bạn đang chạy phiên bản bên dưới SQL Server 2012 SP1 và thấy điều này và bạn đang chạy truy vấn từ xa, vì nó không cho phép sử dụng hoặc từ xa thống kê trong thiết lập này mà không có cách giải quyết (như được liệt kê ở trên), sau đó nó xử lý theo từng hàng như Kin đã nêu ở trên do truy vấn không được tối ưu hóa bằng cách sử dụng số liệu thống kê cho kế hoạch truy vấn tốt nhất và có vấn đề về thẻ.

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

Chà ... Chúng tôi đã giải quyết vấn đề. Có một Cập nhật, bên trong quy trình đang chạy "chọn * từ ...". Tôi nhận xét cập nhật. không có vấn đề nữa

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.