我有一个只读数据库(产品),它在自己的Sql Server 2008上。
我已经通过查看活动监视器中最昂贵的查询 - 报告来优化查询。我按CPU成本订购了报告。我现在有50次查询/秒,没有查询超过300毫秒。
CPU时间正常(30%),内存仅使用20%(超出64GB)。
有一个问题:磁盘时间稳定在100%(我查看了空闲时间性能计数器并使用了ideras SQL诊断管理器)。我可以看到产品db的行为与我的订单db不同,后者位于不同的机器上并且具有较小的表:如果我查看分析器跟踪,我在product-db中有查询,显示“read”列中的值高于50.000 。在我的订单数据库中,这些值永远不会高于1000.product-db中的查询使用大量的通用表表达式,处理大型表(有些表约为500万条)。
如果我应该花时间优化i / o性能查询,或者我应该只添加服务器,那么我并不感到害羞。通过确定查询持续时间,我已经添加了缺失的索引。是否正在优化i / o通常会做什么?
答案 0 :(得分:5)
简而言之,是的。优化 CPU和IO。
具有高CPU的查询往往会进行不必要的内存中排序(有时效率低下)散列连接或复杂逻辑。
具有高IO(页面读取)的查询倾向于进行全表扫描或以其他低效方式工作。
10次中有9次,相同的查询将在列表的顶部附近,但是如果您已经在高CPU上工作但仍然对性能不满意,那么无论如何都要处理高IO过程下。
答案 1 :(得分:4)
他们说。总有下一个瓶颈。
既然您已经调整了CPU使用率,那么I / O负载自然会占据主导地位。你的表现是否可以接受?如果是,请停止,如果没有,您必须估计需要投入多少小时进一步调整,如果购买另一台服务器或更多硬盘可能更便宜。
再次关于I / O调整,尝试通过简单的措施了解您可以实现的目标。有时您可以将CPU换成I / O,反之亦然。压缩就是一个例子。然后,您将调整当前瓶颈的组件。
在寻求提高I / O速度之前,请尝试减少生成的I / O.
答案 2 :(得分:1)
查看查询的明显IO性能改进,但更重要的是,看看如何在服务器级别提高IO性能。
如果您的其他资源(CPU和内存)没有超载,则可能不需要新服务器。考虑为日志和临时文件添加SSD,和/或考虑是否可以将整个数据库安装到SSD阵列上。
当然,清除磁盘IO瓶颈可能会提高CPU使用率,但如果您的性能接近可接受,这可能会改善您现在可以停止优化的程度。
答案 3 :(得分:0)
除非您使用SSD或数据库优化的SAN,否则IO几乎总是数据库应用程序的限制。
所以是的,优化以尽可能地摆脱它。
表索引是首先要做的事情。
然后,尽可能多地添加RAM,直到数据库文件的完整大小。
然后对数据表进行分区(如果这是合理的事情),以便只在一个或两个表分区上进行任何必要的表或索引扫描。
然后我想你要么购买更大内存和/或购买SSD的更大机器,要么购买带有SSD的SAN或SAN。
或者,您可以重建整个数据库应用程序以使用NoSQL或数据库分片,并在中间接口层实现所有关系,连接,约束等。