0

我有一个 ASP.NET Web 应用程序(使用 Microsoft VS 2010 用 C# 编写。)由于它安装在 SQL Server 上,因此我得到了以下性能统计报告:

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

我不能把所有涉及的源代码都放在这里——发布太多了。所以我想知道,我可以从哪里开始解决这个问题?

4

2 回答 2

9

SQL 服务器探查器。您可以找出执行时间最长的查询(或存储过程)并从那里开始。

另一个需要查看的地方是查看从应用程序创建了什么样的查询(即它是使用 LINQ to SQL,是使用参数化查询还是存储过程,或者它们是否创建动态查询字符串)。

更新:如果您使用的是 SQL Server 的 Express 版本,应注意SQL Server 2012 Express 的 SP1附带包含 Profiler 的 SQL Management Studio Express。

于 2013-02-27T20:24:49.320 回答
4

即使我有工具作为快速入门的方式,我通常也会使用下面的查询。这些工具对于分析查询和许多其他任务仍然很有用,但要快速了解服务器过载的原因,它非常有用。

查看要索引的列的有用查询:

SELECT TOP 10
[Total Cost] = ROUND(avg_total_user_cost * avg_user_impact * (user_seeks + user_scans),0)
, avg_user_impact
, TableName = statement
, [EqualityUsage] = equality_columns
, [InequalityUsage] = inequality_columns
, [Include Cloumns] = included_columns
FROM sys.dm_db_missing_index_groups g
INNER JOIN sys.dm_db_missing_index_group_stats s
ON s.group_handle = g.index_group_handle
INNER JOIN sys.dm_db_missing_index_details d
ON d.index_handle = g.index_handle
ORDER BY [Total Cost] DESC;

查找昂贵查询的有用查询:

SELECT TOP 10 SUBSTRING(qt.TEXT, (qs.statement_start_offset/2)+1,
((CASE qs.statement_end_offset
WHEN -1 THEN DATALENGTH(qt.TEXT)
ELSE qs.statement_end_offset
END - qs.statement_start_offset)/2)+1),
qs.execution_count,
qs.total_logical_reads, qs.last_logical_reads,
qs.total_logical_writes, qs.last_logical_writes,
qs.total_worker_time,
qs.last_worker_time,
qs.total_elapsed_time/1000000 total_elapsed_time_in_S,
qs.last_elapsed_time/1000000 last_elapsed_time_in_S,
qs.last_execution_time,
qp.query_plan
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) qt
CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) qp
ORDER BY qs.total_logical_reads DESC -- logical reads
-- ORDER BY qs.total_logical_writes DESC -- logical writes
-- ORDER BY qs.total_worker_time DESC -- CPU time

请注意,以注释开头的行--是注释,因此请注意上述查询的最后三行,您可以通过 CPU 时间、逻辑读取或逻辑写入进行选择。

请注意,您通常询问过性能,但是您的屏幕截图都与锁有关。基于此,我会尝试找到您在应用程序中制作这些锁的位置。也许可以减少锁定/交易的持续时间?

参考:

于 2013-02-27T20:50:52.583 回答