Простые показатели производительности для SQL Server 2000 - PullRequest
1 голос
/ 05 июня 2009

Отчеты, которые я использую (и обновляю), занимают много времени (некоторые занимают часы). Я чувствовал, что это слишком долго, и ранее спрашивал об этом. Взглянув на различные веб-сайты, на которых обсуждается производительность SQL, все они принимают позицию администратора баз данных. Однако я не являюсь, как и мои коллеги (думаю, если бы у нас был администратор базы данных, у нас не было бы этой проблемы).

То, что я хочу, - это простой способ вернуть топ-10 или около того наиболее запущенных и худших сценариев. Хотелось бы надеяться, что есть хороший переключатель SET METRICS ON, но, думаю, если бы это было так, сайты не стали бы заниматься записью профилей.

Последнее, что я хочу сделать, это сделать производительность еще ниже, а запись профиля звучит как убийца производительности.

Ответы [ 2 ]

1 голос
/ 05 июня 2009

Вы должны иметь возможность просматривать таблицу sys.dm_exec_query_stats, в которой хранится информация обо всех запросах к базе данных.

SELECT  creation_time  
    ,last_execution_time 
    ,total_physical_reads
    ,total_logical_reads  
    ,total_logical_writes
    , execution_count 
    , total_worker_time
    , total_elapsed_time 
    , total_elapsed_time / execution_count avg_elapsed_time
    ,SUBSTRING(st.text, (qs.statement_start_offset/2) + 1,
     ((CASE statement_end_offset 
      WHEN -1 THEN DATALENGTH(st.text)
      ELSE qs.statement_end_offset END 
        - qs.statement_start_offset)/2) + 1) AS statement_text
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) st
ORDER BY last_execution_time,total_elapsed_time / execution_count DESC;

Предоставляет базовую информацию о времени, которое исторически занимало запросы.

1 голос
/ 05 июня 2009

У вас есть как минимум следующие варианты.

  • посмотрите на план плохо выполненного запроса в SQL Analyzer и попробуйте оптимизировать его, запросите оттуда запрос.
  • или используйте скрипт (см. Ниже), чтобы дать вам совет , анализируя статистику SQLServer о том, какие индексы вы можете создать.
  • или используйте Помощник по настройке ядра СУБД , чтобы предлагать и / или создавать индексы для ускорения запросов
  • или используйте такой инструмент, как Redgate's SQL Response , чтобы дать вам больше информации, чем вы можете переварить

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


SET CONCAT_NULL_YIELDS_NULL OFF
--Joining the views gives a nice picture of what indexes 
--would help and how much they would help
SELECT 
  'CREATE INDEX IX_' + UPPER(REPLACE(REPLACE(COALESCE(equality_columns, inequality_columns), '[', ''), ']', ''))
    + ' ON ' + d.statement + '(' + COALESCE(equality_columns, inequality_columns) 
  + CASE WHEN equality_columns IS NOT NULL THEN  
        CASE WHEN inequality_columns IS NOT NULL THEN ', ' + inequality_columns 
        END END 
    + ')' + CASE WHEN included_columns IS NOT NULL THEN ' INCLUDE (' + included_columns + ')' END
  , object_name(object_id)
  , d.*
  , s.*
FROM    sys.dm_db_missing_index_details d 
      LEFT OUTER JOIN sys.dm_db_missing_index_groups g ON   d.index_handle = g.index_handle
      LEFT OUTER JOIN sys.dm_db_missing_index_group_stats s ON  g.index_group_handle = s.group_handle
WHERE   database_id = db_id()
ORDER BY avg_total_user_cost DESC
...