Устранение проблем с производительностью базы данных - PullRequest
0 голосов
/ 08 апреля 2011

У меня проблема с базой данных, и вот сценарий, с которым я сталкиваюсь каждый день: обычно приложение может работать с трафиком и т. Д., Но несколько раз в день я сталкиваюсь с проблемой производительности. Когда это происходит, хранимые процедуры увеличивают время выполнения с 200% до 1000%.
У меня есть один, описанный здесь: https://stackoverflow.com/questions/5585726/query-with-large-table-joins-optimization-techniques. Обычно его выполнение занимает около 6-8 секунд (я уже оптимизировал его с 20 секунд, потому что в начале я думал, что процедура является виновником), но когда что-то происходит, эта процедура может выполнить даже 60 секунд.
И сегодня я понял, что в приложениях больше мест, которые зависают, и, более того, я случайно осознал, что примеры запросов, исходящих из SQL Management Studio, которые обычно выполняются в мгновение ока, начинают замедляться, когда что-то происходит с сервером базы данных. Хорошей новостью является то, что благодаря этой находке я устранил как узкие места, так и веб-серверы приложений.
Это сервер базы данных, который не может обрабатывать запросы. Интересно, есть ли способ устранения неполадок с работающей базой данных и определения медленных запросов или других действий, таких как переобучение индексов, статистики, проблем с памятью и т. Д. Или, возможно, других проблем, которые могут привести к описанному снижению производительности?

Спасибо, Павел

Ответы [ 2 ]

2 голосов
/ 08 апреля 2011

Это запрос, которым я пользуюсь постоянно.

Показывает , выполняющий в данный момент код , Информация об ожидании , информация о блокировке, какие спиды запущены, как долго они выполняются, какая текущая команда, что текст запроса и план запроса xml , если он есть в кэше:

SELECT 
d2.wait_type,
d1.session_id,
d2.blocking_session_id, 
d2.status,
d1.login_name,
d2.start_time, 
d2.command,
d3.[text] as Batch, 
SUBSTRING(d3.[text], (d2.statement_start_offset/2) + 1,
    ((CASE statement_end_offset 
        WHEN -1 THEN DATALENGTH(d3.text)
        ELSE d2.statement_end_offset END 
            - d2.statement_start_offset)/2) + 1) AS Current_Statement,
qp.query_plan,
d1.login_time, 
d2.wait_time,
d2.cpu_time, 
d1.memory_usage,
d2.total_elapsed_time, 
d2.reads,d2.writes,
d2.logical_reads
FROM sys.dm_exec_sessions d1
JOIN sys.dm_exec_requests d2 ON d1.session_id=d2.session_id
CROSS APPLY sys.dm_exec_sql_text(d2.sql_handle) d3 
CROSS APPLY sys.dm_exec_query_plan(d2.plan_handle) AS qp
WHERE d1.session_id <> @@SPID
1 голос
/ 08 апреля 2011

В SSMS, если вы щелкнете правой кнопкой мыши по имени Сервера (не по имени БД), появится меню Activity Monitor, щелкните по нему, и это будет хорошее место для запуска.

...