如何确定我的SQL Server数据库性能是否受硬件限制?


8

在当前处于单用户负载下测试应用程序-随着测试数据增加到生产规模(每张表400k-2M行),某些SELECT sp的速度不再足够快(测试数据有限,以前每个数据小于30ms,现在是100-200ms,但是有几个,因此延迟在UI中变得很明显)。


几乎可以保证是代码和设计,而不是硬件...
gbn

如果您的查询可以利用分析功能,则sql server 2000肯定是软件限制的。
bernd_k 2011年

好吧,至少不完全是硬件-我在测试机器上并排放置了一个2008 Express实例。2000次仍在同一范围内,2008年均为<20ms。waitstats似乎并没有阐明区别。清除统计信息并进行相同的应用测试后,2000的PAGEIOLATCH_SH等待时间为2.48s,平均等待时间为4ms。2008年有2.14秒,平均等待2毫秒。哪个更好,但不能解释实际响应时间的10倍改进-仅仅是从2000年到2008年的通用引擎增强而未在统计数据中反映出来吗?
Pastymage 2011年

Answers:


8

您可以使用DBCC SQLPERF("waitstats")。这将返回您的SQL Server正在等待哪些任务的等待时间。可以在网上找到每个计数器的详细说明。您可以使用此信息来找出瓶颈。

另外,在查询分析器中打开客户端统计信息,以查看客户端的等待时间。

我假设您的硬件自初始测试以来就没有改变,因此,由于它们是不变的,所以我不会怀疑它们。


我抓了几个查询,以便从waitstats中排序和过滤相关信息,但并没有告诉我太多信息(请参阅我对原始项目的评论)。
Pastymage 2011年

@Pastymage还尝试在SQL 2000 DB中运行sp_updatestats。他们再次尝试查询,看看是否有任何性能改进。
StanleyJohns 2011年

不,完全一样。同上,用于DBCC更新。
Pastymage 2011年

2

想法:

  • 硬件几乎从来不是问题:设计和代码很差
  • 始终以接近生产的数据质量和数量进行测试

一些解决方案:

运行缺少的索引DMV,以查看缺少的索引:

SELECT 
  migs.avg_total_user_cost * (migs.avg_user_impact / 100.0) * (migs.user_seeks + migs.user_scans) AS improvement_measure, 
  'CREATE INDEX [missing_index_' + CONVERT (varchar, mig.index_group_handle) + '_' + CONVERT (varchar, mid.index_handle) 
  + '_' + LEFT (PARSENAME(mid.statement, 1), 32) + ']'
  + ' ON ' + mid.statement 
  + ' (' + ISNULL (mid.equality_columns,'') 
    + CASE WHEN mid.equality_columns IS NOT NULL AND mid.inequality_columns IS NOT NULL THEN ',' ELSE '' END 
    + ISNULL (mid.inequality_columns, '')
  + ')' 
  + ISNULL (' INCLUDE (' + mid.included_columns + ')', '') AS create_index_statement, 
  migs.*, mid.database_id, mid.[object_id]
FROM sys.dm_db_missing_index_groups mig
INNER JOIN sys.dm_db_missing_index_group_stats migs ON migs.group_handle = mig.index_group_handle
INNER JOIN sys.dm_db_missing_index_details mid ON mig.index_handle = mid.index_handle
WHERE migs.avg_total_user_cost * (migs.avg_user_impact / 100.0) * (migs.user_seeks + migs.user_scans) > 10
ORDER BY migs.avg_total_user_cost * migs.avg_user_impact * (migs.user_seeks + migs.user_scans) DESC

...以及最昂贵的DMV查询

SELECT TOP 20
    qs.sql_handle,
    qs.execution_count,
    qs.total_worker_time AS Total_CPU,
    total_CPU_inSeconds = --Converted from microseconds
    qs.total_worker_time/1000000,
    average_CPU_inSeconds = --Converted from microseconds
    (qs.total_worker_time/1000000) / qs.execution_count,
    qs.total_elapsed_time,
    total_elapsed_time_inSeconds = --Converted from microseconds
    qs.total_elapsed_time/1000000,
    st.text,
    qp.query_plan
FROM
    sys.dm_exec_query_stats AS qs
        CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st
        CROSS apply sys.dm_exec_query_plan (qs.plan_handle) AS qp
ORDER BY qs.total_worker_time DESC

否则,这个SO问题会向我和其他SQL高级代表提供很好的提示:https : //stackoverflow.com/q/4118156/27535(我不会复制/粘贴所有3个冗长的答案)


这些动态管理视图是伟大的,但2005+不工作于2000年
SqlSandwiches

@SqlSandwiches:糟糕,错过了。
gbn

在我设置的2008 Express实例中对此进行了尝试-dm_exec_query_stats似乎不存在?
Pastymage 2011年

1

记录系统资源或查看任务管理器以查看进程使用了​​多少系统资源。


1

应该考虑的有趣的事情是运行的MSSQL 2000版本

二进制文件有四个版本

  1. 表达
  2. 标准
  3. 专业的
  4. 企业

这些版本中的每一个都有关于RAM和CPU的限制。

值得探讨的可能性是,由于查询需要更多的RAM来满足查询/子查询的需求或CPU利用率不足,当前存储的数据量已根本超过了MSSQL 2000版本的功能。您可能需要将二进制版本升级到MSSQL 2000 Entrprise版本(可能是因为您的MSSQL版本多旧而导致的远景)或预算可以承受的最佳版本。

您甚至可能想摆脱MSSQL 2000,因为2008是最新的并且具有当前支持。同样,这可能是预算问题。如果您已经在使用Enterprise,或者您的预算不允许进行任何重大升级,那么现在您可以浏览数据库统计信息或数据库设计。

免责声明:我不是SQL Server DBA


升级到2008年似乎是一个快速解决方案,因为即使具有1个CPU和1 GB RAM限制的2008 Express也已完全解决了该问题。尽管如此,我还是想了解为什么/如何 ...
Pastymage 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.