2009-12-21 2 views
20

Мы создали так много неэффективной хранимой процедуры в нашем приложении, мы всегда откладываем ее, чтобы сделать ее более эффективной, пока у нас не возникнет серьезная проблема с производительностью базы данных.Большая часть выполняемых хранимых процедур?

Теперь я собираюсь исправить это по одному заказу чаще всего с помощью хранимой процедуры.

Каков наилучший способ выяснить, какая хранимая процедура наиболее выполнена?

Есть ли сценарий, который может показать, какая хранимая процедура наиболее выполнена?

ответ

23

Использование:

SELECT TOP 10 
     qt.TEXT AS 'SP Name', 
     SUBSTRING(qt.text, qs.statement_start_offset/2, CASE WHEN (qs.statement_end_offset = -1) THEN LEN(qt.text) ELSE (qs.statement_end_offset - qs.statement_start_offset)/2 END) AS actual_query, 
     qs.execution_count AS 'Execution Count', 
     qs.total_worker_time/qs.execution_count AS 'AvgWorkerTime', 
     qs.total_worker_time AS 'TotalWorkerTime', 
     qs.total_physical_reads AS 'PhysicalReads', 
     qs.creation_time 'CreationTime', 
     qs.execution_count/DATEDIFF(Second, qs.creation_time, GETDATE()) AS 'Calls/Second' 
    FROM sys.dm_exec_query_stats AS qs 
    CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS qt 
WHERE qt.dbid = (SELECT dbid 
        FROM sys.sysdatabases 
        WHERE name = '[your database name]') 
ORDER BY qs.total_physical_reads DESC 

Код: SQL SERVER – 2005 – Find Highest/Most Used Stored Procedure

+0

Вы можете также извлечь 'SUBSTRING (текст, statement_start_offset/2, случай, когда (statement_end_offset = -1), то LEN (текст) остальное (statement_end_offset-statement_start_offset)/2-й конец)' для фактического запроса внутри SP –

+0

@Remus: Добавлено, спасибо! –

+0

он должен быть SUBSTRING (qt.text, qs.statement_start_offset/2, CASE WHEN (qs.statement_end_offset = -1) THEN LEN (qt.text) ELSE (qs.statement_end_offset - qs.statement_start_offset)/2 END) AS actual_query, –

0

Типичная ситуация ..

Запуск анализатора производительности А затем запустить приложение установить некоторые фильтры, чтобы захватить большое количество операций чтения/записи/сканирование и т.д ..

1

Быстрый способ выполнить это запустить SQL Profiler, а затем «группировать» вашу трассировку с помощью TextData.

  • Перейти в трассировка Свойства
  • На вкладке Выбор событий, нажмите на организацию колонок ...
  • Нажмите на TextData, и переместить его до «групп» области.

Возможно, вам понадобятся только определенные события, такие как SQL Batch Completed. Если я помню, это даст вам длительность и другую удобную статистику для группировки/фильтрации.

1

Еще один фантастический инструмент - панель инструментов производительности Microsoft. link text

Смежные вопросы