如何解决SQL Server中的性能问题
我有一个相对较大的数据库(每个表有数百万条记录),其中有许多表和索引,这些表和索引是由以前的开发人员设置的,我正在尝试找到一种解决一些性能问题的好方法 我们的应用程序在其整个生命周期中进行了许多数据库调用,我正在尝试找到一种好方法来诊断一些较慢的查询,或者诊断一些缺少索引的实例,或者在我们写入的表上有索引,而我们从中读取的索引更多如何解决SQL Server中的性能问题,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我有一个相对较大的数据库(每个表有数百万条记录),其中有许多表和索引,这些表和索引是由以前的开发人员设置的,我正在尝试找到一种解决一些性能问题的好方法 我们的应用程序在其整个生命周期中进行了许多数据库调用,我正在尝试找到一种好方法来诊断一些较慢的查询,或者诊断一些缺少索引的实例,或者在我们写入的表上有索引,而我们从中读取的索引更多 有哪些快速查询可以帮助我了解我要查找的内容?如果您不熟悉为您跟踪所有这些信息的SQL Server系统表,那么查找这些查询将是一件非常痛苦的事情。然而,希望通过探索我
有哪些快速查询可以帮助我了解我要查找的内容?如果您不熟悉为您跟踪所有这些信息的SQL Server系统表,那么查找这些查询将是一件非常痛苦的事情。然而,希望通过探索我在下面列出的一些查询(针对最常见的问题),您能对您的特定问题有所了解 它的作用:按当前数据库的平均输入/输出使用率列出最重要的语句
SELECT TOP(50) OBJECT_NAME(qt.objectid) AS [SP Name],
(qs.total_logical_reads + qs.total_logical_writes) /qs.execution_count AS [Avg IO],
SUBSTRING(qt.[text],qs.statement_start_offset/2,
(CASE
WHEN qs.statement_end_offset = -1
THEN LEN(CONVERT(nvarchar(max), qt.[text])) * 2
ELSE qs.statement_end_offset
END - qs.statement_start_offset)/2) AS [Query Text]
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS qt
WHERE qt.[dbid] = DB_ID()
ORDER BY [Avg IO] DESC OPTION (RECOMPILE);
SELECT user_seeks * avg_total_user_cost * (avg_user_impact * 0.01) AS [index_advantage],
migs.last_user_seek, mid.[statement] AS [Database.Schema.Table],
mid.equality_columns, mid.inequality_columns, mid.included_columns,
migs.unique_compiles, migs.user_seeks, migs.avg_total_user_cost, migs.avg_user_impact
FROM sys.dm_db_missing_index_group_stats AS migs WITH (NOLOCK)
INNER JOIN sys.dm_db_missing_index_groups AS mig WITH (NOLOCK)
ON migs.group_handle = mig.index_group_handle
INNER JOIN sys.dm_db_missing_index_details AS mid WITH (NOLOCK)
ON mig.index_handle = mid.index_handle
WHERE mid.database_id = DB_ID() -- Remove this to see for entire instance
ORDER BY index_advantage DESC OPTION (RECOMPILE);
使用说明:帮助您找到SP I/O最昂贵的语句
它的作用:可能的错误NC索引(写入>读取)
使用说明:
-查找具有高写入次数和零或极低读取次数的索引
考虑你的工作量
-在删除索引之前进一步调查
它的作用:按索引优势缺少当前数据库的索引
SELECT TOP(50) OBJECT_NAME(qt.objectid) AS [SP Name],
(qs.total_logical_reads + qs.total_logical_writes) /qs.execution_count AS [Avg IO],
SUBSTRING(qt.[text],qs.statement_start_offset/2,
(CASE
WHEN qs.statement_end_offset = -1
THEN LEN(CONVERT(nvarchar(max), qt.[text])) * 2
ELSE qs.statement_end_offset
END - qs.statement_start_offset)/2) AS [Query Text]
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS qt
WHERE qt.[dbid] = DB_ID()
ORDER BY [Avg IO] DESC OPTION (RECOMPILE);
SELECT user_seeks * avg_total_user_cost * (avg_user_impact * 0.01) AS [index_advantage],
migs.last_user_seek, mid.[statement] AS [Database.Schema.Table],
mid.equality_columns, mid.inequality_columns, mid.included_columns,
migs.unique_compiles, migs.user_seeks, migs.avg_total_user_cost, migs.avg_user_impact
FROM sys.dm_db_missing_index_group_stats AS migs WITH (NOLOCK)
INNER JOIN sys.dm_db_missing_index_groups AS mig WITH (NOLOCK)
ON migs.group_handle = mig.index_group_handle
INNER JOIN sys.dm_db_missing_index_details AS mid WITH (NOLOCK)
ON mig.index_handle = mid.index_handle
WHERE mid.database_id = DB_ID() -- Remove this to see for entire instance
ORDER BY index_advantage DESC OPTION (RECOMPILE);
使用说明:
-查看上一次用户查找时间,用户查找的数量有助于确定来源和重要性
-SQL Server过于渴望添加包含的列,所以要小心
-不要盲目地添加从这个查询中显示的索引
它的作用:获取当前数据库中超过一定大小的所有索引的碎片信息
-注意:对于一个非常大的数据库,这可能需要一些时间
SELECT DB_NAME(database_id) AS [Database Name], OBJECT_NAME(ps.OBJECT_ID) AS [Object Name],
i.name AS [Index Name], ps.index_id, index_type_desc,
avg_fragmentation_in_percent, fragment_count, page_count
FROM sys.dm_db_index_physical_stats( NULL,NULL, NULL, NULL ,'LIMITED') AS ps
INNER JOIN sys.indexes AS i
ON ps.[object_id] = i.[object_id]
AND ps.index_id = i.index_id
WHERE database_id = DB_ID()
--AND page_count > 500
ORDER BY avg_fragmentation_in_percent DESC OPTION (RECOMPILE);
使用说明:
-帮助确定关系索引中是否存在碎片
-以及索引维护策略的有效性
这些应该让你开始
我为那些感兴趣的人写了一篇关于这个主题的更长的博文。您应该使用它来跟踪哪些查询到达您的服务器
然后使用测试每个查询。反问句也是如此;)是的,但这花了我很长时间才找到,所以我希望这能帮助其他人节省一些时间:)有类似的postgresql吗?不幸的是,我没有,我住在一家微软商店里!不过祝你好运。使用平均I/O作为衡量标准可能会产生误导,我会使用总I/O,或总I/O除以创建时间和当前时间之间的时间,这取决于你获得新计划的频率一个百万美元的问题!!!不幸的是,没有简单的答案:(