Багато "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 теж. Чи є щось із цим «курсором»?

порожній

DBCC INPUTBUFFER (spid) показує мені це:

друк

Тобто це питання тут (зроблений мною) , але я не знаю , якщо це те ж саме.


EDIT1:

Використовуючи запит, наданий кином, я бачу таке:

ще немає коду.


EDIT2:

Використовуючи Монітор активності, я бачу це:

Мос дорогий запит

Це найдорожчий запит (Перший - навмисний, про це ми знаємо).

І знову хочеться знати, чому це select * from...причина FETCH CURSOR...


EDIT3:

Цей " select * from..." працює з іншого сервера (через linked server).

Ну, а тепер у мене проблеми зрозуміти, що сказав @kin.

Це execution planзапит (працює на тому ж сервері бази даних):

той же сервер бази даних

це зараз, план виконання, який працює на іншому сервері, через пов'язаний сервер:

введіть тут опис зображення

Гаразд, теж не проблема. І зараз! план виконання через **activity monitor**(те саме select * from):

що, чорт тут, відбувається?

Відповіді:


3

Це простий вибір. Чому для цього використовується fetch_cursor?

SELECTГенерується система з допомогою розподіленої структури запитів, і пов'язаний з UPDATEви знайшли.

Оператор плану запитів на віддалене оновлення використовує sp_cursorмодель для отримання рядків з віддаленого джерела даних. Це причина всіх дзвінків API курсору.

Я вважаю, що план курсору, який ви показуєте у своєму запитанні, - це внутрішній курсор, відкритий двигуном в рамках цього процесу, але я ще не встиг спробувати це відтворити.


1

Ну ... Ми вирішили проблему. Всередині процедури відбулося оновлення, яке виконує "select * from ...". Я прокоментував оновлення. більше проблем немає.


1

Це може бути проблемою при викликах OLEDB на віддалені сервери (пов'язані сервери та конфігурації SSIS використовують OLEDB).

Це вада дизайну, помилка Microsoft SQL Server, яка не була виправлена ​​до моменту, коли SQL Server 2012 SP1, як я пам’ятаю, де не дозволяє віддаленій статистиці використовувати віддалену оптимізацію запиту.

Вам потрібно буде запустити sp_WhoIsActive ( завантажити / документи ) з сервера REMOTE в запиті, а також побачити трафік, але SQL Server, який не є SP1 2012, чомусь не дозволяє використовувати віддалену статистику, навіть якщо логін має читач даних доступ до всіх таблиць на віддаленому сервері.

Рішення Майкрософт полягає у наданні зв'язаного облікового запису сервера, який робить віддалений виклик, щоб мати SA, або ddladmin або DBO доступ до віддаленого сервера / таблиці (ів).

Я використовував це для вирішення цієї проблеми в деяких наших налаштуваннях, які здебільшого є прозорими з точки зору рішення, не допускаючи підвищених дозволів для DB або SQL серверів на віддаленій стороні. В основному вам потрібно надати роль ddladmin віддаленого входу у відповідну віддалену БД SQL Server, а потім створити роль з явними дозволами DENY для змін об’єктного рівня, якщо ви лише плануєте дозволити SELECT доступ.

Нижче наведена копія спеціальної фіксованої ролі БД, яку я створюю для цього, але ви, можливо, захочете перевірити та підтвердити або відрегулювати додатково плюс деякі читання та дослідження, але вирішено прозоро для мене в деяких випадках - кеш може знадобитися очистити, хоч перш ніж він працює так майте це на увазі, і як тільки це буде очищено, запустіть його двічі і перевірте як місцеву активність, так і віддалену активність.

Отже, дозвольте довіреній системі роль ddladmin у віддаленій БД, ви дозволите інші звичайні дозволи на віддаленій БД, ви створите користувацьку роль БД, як я вказано нижче, на цьому ж сервері, а потім ви додасте цей самий обліковий запис до цього нового спеціального виправленого файлу Роль БД з явним запереченням, очистити кеш, запустіть запит двічі або більше після очищення кешу, щоб побачити, чи він вирішується.

Спеціально відповісти на ваше запитання, хоча з тієї причини, коли ви бачите ці вилучення курсорів, якщо ви працюєте з версією нижче SQL Server 2012 SP1 і бачите це, а ви виконуєте віддалений запит, оскільки він не дозволяє використовувати або віддалений запит статистика в цьому налаштуванні без вирішення (як зазначено вище), тоді вона виконує порядок обробку рядків, як було зазначено вище, оскільки запит не оптимізовано за допомогою статистики для найкращого плану запитів і має проблему кардинальності.

/* 
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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.