Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何解决SQL Server中的性能问题_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

如何解决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除以创建时间和当前时间之间的时间,这取决于你获得新计划的频率一个百万美元的问题!!!不幸的是,没有简单的答案:(