Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как посмотреть почему тормозит SQL-сервер  [new]
kzzae
Guest
Иногда на сервере появляется Тип ожидания процесса PAGEIOLATCH_SH, а в сведениях что-то типа FETCH API_CURSOR0000000000089AEF и висит по несколько минут. Как я понимаю - это происходит какая-то длительная операция данных с диском. По-моему, такого быть не должно, явно на сервер какие-то плохие запросы приходят или диск тупит.

Возможно ли как-то узнать какие именно данные содержит указанный курсор чтобы попытаться понять что именно читается и с какого диска?

Или может быть я вообще не в ту сторону копаю? Что вообще принято в таких случаях делать?
5 дек 12, 15:52    [13582302]     Ответить | Цитировать Сообщить модератору
 Re: Как посмотреть почему тормозит SQL-сервер  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
kzzae
Иногда на сервере появляется Тип ожидания процесса PAGEIOLATCH_SH, а в сведениях что-то типа FETCH API_CURSOR0000000000089AEF и висит по несколько минут. Как я понимаю - это происходит какая-то длительная операция данных с диском. По-моему, такого быть не должно, явно на сервер какие-то плохие запросы приходят или диск тупит.

Возможно ли как-то узнать какие именно данные содержит указанный курсор чтобы попытаться понять что именно читается и с какого диска?

Или может быть я вообще не в ту сторону копаю? Что вообще принято в таких случаях делать?
При этом типе ожидания обычно указывается ресурс в виде DBId:FileId:PageId
5 дек 12, 21:49    [13584478]     Ответить | Цитировать Сообщить модератору
 Re: Как посмотреть почему тормозит SQL-сервер  [new]
Andy_OLAP
Member

Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион
Сообщений: 3151
kzzae
Иногда на сервере появляется Тип ожидания процесса PAGEIOLATCH_SH, а в сведениях что-то типа FETCH API_CURSOR

У Вас дикая фрагментация индексов, которые используются в курсоре. Предполагаю, что работает связка 1С и SQL.
Ищите индексы, у которых процент индексации больше 25%:
SELECT * FROM sys.dm_db_index_physical_stats (DB_ID(N'название базы'), NULL, NULL, NULL, NULL);
5 дек 12, 23:00    [13584764]     Ответить | Цитировать Сообщить модератору
 Re: Как посмотреть почему тормозит SQL-сервер  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
Andy_OLAP
kzzae
Иногда на сервере появляется Тип ожидания процесса PAGEIOLATCH_SH, а в сведениях что-то типа FETCH API_CURSOR
У Вас дикая фрагментация индексов
Мне интересно как вы это выяснили по предоставленным сведениям?
5 дек 12, 23:13    [13584794]     Ответить | Цитировать Сообщить модератору
 Re: Как посмотреть почему тормозит SQL-сервер  [new]
Andy_OLAP
Member

Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион
Сообщений: 3151
Mind,

Интуиция и некоторый опыт работы с MS SQL.
5 дек 12, 23:58    [13584923]     Ответить | Цитировать Сообщить модератору
 Re: Как посмотреть почему тормозит SQL-сервер  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
Andy_OLAP
Mind,

Интуиция и некоторый опыт работы с MS SQL.
Пальцем в небо значит )
6 дек 12, 01:22    [13585131]     Ответить | Цитировать Сообщить модератору
 Re: Как посмотреть почему тормозит SQL-сервер  [new]
kzzae
Guest
Mind
При этом типе ожидания обычно указывается ресурс в виде DBId:FileId:PageId


Да, есть такое. Например, 5:8:252409

Из 5 легко получить имя базы с помощью DB_NAME

Дальше сложнее. Делаю запрос:
SELECT * FROM sysobjects WHERE type = 'U'

Это по идее все пользовательские таблицы, там 8 нигде и близко нет. Как по id имя таблицы получить?
А pageid чем вообще может быть полезен?
6 дек 12, 09:09    [13585545]     Ответить | Цитировать Сообщить модератору
 Re: Как посмотреть почему тормозит SQL-сервер  [new]
kzzae
Guest
kzzae
Дальше сложнее. Делаю запрос:
SELECT * FROM sysobjects WHERE type = 'U'

Это по идее все пользовательские таблицы, там 8 нигде и близко нет. Как по id имя таблицы получить?
А pageid чем вообще может быть полезен?


Так, по-моему, я ступил. ID таблицы здесь ни причем. Что тогда такое Field? То есть где искать код 8 и что потом с ним делать?
6 дек 12, 09:17    [13585556]     Ответить | Цитировать Сообщить модератору
 Re: Как посмотреть почему тормозит SQL-сервер  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
kzzae
Так, по-моему, я ступил. ID таблицы здесь ни причем. Что тогда такое Field?


Не Field, а FileID - идентификатор файла в базе. Дальше идет идентификатор страницы.
6 дек 12, 09:32    [13585608]     Ответить | Цитировать Сообщить модератору
 Re: Как посмотреть почему тормозит SQL-сервер  [new]
Гость333
Member

Откуда:
Сообщений: 3683
kzzae
где искать код 8 и что потом с ним делать?

dbcc traceon(3604);
dbcc page(5, 8, 252409, 3);


Краткая статья о DBCC PAGE
6 дек 12, 09:35    [13585618]     Ответить | Цитировать Сообщить модератору
 Re: Как посмотреть почему тормозит SQL-сервер  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
В какие-то дебри полезли... http://technet.microsoft.com/en-us/library/cc966540.aspx?ppud=4#EFAA Раздел I/O Bottlenecks.

Сообщение было отредактировано: 6 дек 12, 09:50
6 дек 12, 09:49    [13585671]     Ответить | Цитировать Сообщить модератору
 Re: Как посмотреть почему тормозит SQL-сервер  [new]
kzzae
Guest
pkarklin
В какие-то дебри полезли... http://technet.microsoft.com/en-us/library/cc966540.aspx?ppud=4#EFAA Раздел I/O Bottlenecks.


Хорошая статья, только вот что непонятно. Дохожу до выполнения запроса типа такого:

select text
from sys.dm_exec_sql_text(
0x02000000011EE41897191D6B80A1273916B4312E17C14F97)

и он мне выдает:

FETCH API_CURSOR0000000002DE23ED

И дальше что делать? Опять возвращаемся к исходному вопросу темы.
6 дек 12, 11:06    [13586248]     Ответить | Цитировать Сообщить модератору
 Re: Как посмотреть почему тормозит SQL-сервер  [new]
Гость333
Member

Откуда:
Сообщений: 3683
kzzae
он мне выдает:

FETCH API_CURSOR0000000002DE23ED

И дальше что делать? Опять возвращаемся к исходному вопросу темы.

Дальше можно проверить план запроса.
автор
Similarly, you can run the following query to find to the query plan to identify if the large number of I/Os is a result of a poor plan choice.
select *  
from sys.dm_exec_query_plan  
    (0x0600050099EC8520A8619803000000000000000000000000)
6 дек 12, 11:48    [13586741]     Ответить | Цитировать Сообщить модератору
 Re: Как посмотреть почему тормозит SQL-сервер  [new]
kzzae
Guest
Гость333
Дальше можно проверить план запроса.


И что это даст? В плане единственная операция FETCH CURSOR.

Это если был бы запрос, то можно план посмотреть, а если Fetch, то как быть?
6 дек 12, 11:58    [13586849]     Ответить | Цитировать Сообщить модератору
 Re: Как посмотреть почему тормозит SQL-сервер  [new]
Glory
Member

Откуда:
Сообщений: 104751
select * from sys.dm_exec_cursors(0)
6 дек 12, 12:09    [13586964]     Ответить | Цитировать Сообщить модератору
 Re: Как посмотреть почему тормозит SQL-сервер  [new]
Гость333
Member

Откуда:
Сообщений: 3683
kzzae
Гость333
Дальше можно проверить план запроса.


И что это даст? В плане единственная операция FETCH CURSOR.

Это если был бы запрос, то можно план посмотреть, а если Fetch, то как быть?

Это вы уже проверили и не нашли там плана запроса, или теоретически рассуждаете? Сделайте курсор с какой-нибудь простейшей выборкой из таблицы и посмотрите в профайлере, есть ли план у FETCH и какой.
6 дек 12, 12:10    [13586967]     Ответить | Цитировать Сообщить модератору
 Re: Как посмотреть почему тормозит SQL-сервер  [new]
kzzae
Guest
Гость333
Это вы уже проверили и не нашли там плана запроса, или теоретически рассуждаете?


Проверил. Там где нормальный запрос показывается нормальный план, а там где FETCH API_CURSOR... показывается операция FETCH CURSOR и все.
6 дек 12, 12:37    [13587259]     Ответить | Цитировать Сообщить модератору
 Re: Как посмотреть почему тормозит SQL-сервер  [new]
Гость333
Member

Откуда:
Сообщений: 3683
kzzae,

Извиняюсь, что ввёл в заблуждение, это я перепутал API-курсоры и SQL-курсоры...
6 дек 12, 14:33    [13588266]     Ответить | Цитировать Сообщить модератору
 Re: Как посмотреть почему тормозит SQL-сервер  [new]
kzzae
Guest
Получается, что для API-курсора нельзя посмотреть что именно делает сервер, выполняя FETCH API_CURSOR...?

По идее такой курсор создает программный интерфейс (в моем случае ODBC) и к ожиданию приводит выполнение SQLFetch, а нужно узнать, что перед этим передали SQLExecDirect/SQLPrepare.

Интересно такое возможно?
6 дек 12, 17:15    [13589625]     Ответить | Цитировать Сообщить модератору
 Re: Как посмотреть почему тормозит SQL-сервер  [new]
Гость333
Member

Откуда:
Сообщений: 3683
kzzae,

Текст запроса для API-курсора, оказывается, можно посмотреть:
Hunting down the origins of FETCH API_CURSOR and sp_cursorfetch
6 дек 12, 17:17    [13589643]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить