3

我有一个在 MS SQL Server 上使用单个数据库的应用程序。我需要了解一些有关应用程序对数据库的请求的统计信息,以分析它并提高性能。

基本上,我需要在SQL Server Management Studio的Activity Monitor最近昂贵的查询中显示的信息摘要。要知道的最重要的事情是在确定的时间段内(繁重功能的工作时间)执行查询的总数。请考虑到活动监视器中的查询如下所示:

SELECT [A],[B],[C] FROM [Table] WHERE [ID]=@1

因此,通常有相同的查询但具有不同的参数。

请让我知道收集此类数据的选项,或者只是分享您对“如何”的想法。我将学习并尝试它并写下结果。
谢谢!

4

3 回答 3

2

我真的很喜欢这个人提供的文章

http://blog.sqlauthority.com/2010/05/14/sql-server-find-most-expensive-queries-using-dmv/

另外,我会确保您的应用程序有自己的 SQl 登录,因为它会使分析数据时的事情变得更加容易。

于 2013-08-28T16:28:53.573 回答
2

您可以获得现在正在执行的所有查询。

USE master;

SELECT  st.text,
    r.session_id,
    r.status,
    r.command,
    r.cpu_time,
    r.total_elapsed_time
FROM    sys.dm_exec_requests r
    CROSS APPLY sys.dm_exec_sql_text(sql_handle) AS st

您可以获得所有 50 个最后执行的查询

SELECT TOP 50
    deqs.last_execution_time AS [Time],
    dest.text AS [Query]
FROM    sys.dm_exec_query_stats AS deqs
    CROSS APPLY sys.dm_exec_sql_text(deqs.sql_handle) AS dest
ORDER BY deqs.last_execution_time DESC

我建议您使用 SQL Server Profiler,分析您的数据库并将结果保存在数据库中的一个表中,然后选择所有命令并按此分组进行分析。

Select * 
From
(
    Select 
        Convert(VarChar(Max) , PT.TextData ) As ExecutedCommand ,
        COUNT( RowNumber ) As CommandCount
    From ProfilerTable As PT (nolock)
    Where       
        ( PT.TextData Is Not Null )
        And
        ( PT.EndTime Is Not Null )
    Group By Convert( VarChar( Max ) , PT.TextData )
) As SubQuery
Order By SubQuery.CommandCount Desc
于 2013-08-31T18:30:32.397 回答
1

将查询插入 SSMS 并打开查询/包含实际执行计划。这将需要一些时间来习惯阅读,但一般来说,寻找表扫描。表扫描通常意味着索引应该存在于连接、分组依据或 where 子句列上。

于 2013-08-28T16:50:34.167 回答