ASP.NET / SQL 2008性能问题

时间:2011-01-20 16:11:40

标签: asp.net database optimization orm query-optimization

我们开发了一个带有搜索界面的系统,看起来像这样:

http://demo1.nsourceservices.com/images/logos/stackoverflow1.png

如您所见,有一些相当严肃的搜索功能。您可以使用状态,渠道,语言,广告系列类型的任意组合,然后按名称等缩小范围。

然后,一旦您搜索到并且在底部弹出了潜在客户,您就可以对标题进行排序。

查询使用ROWNUM来执行分页方案,因此我们一次只返回70行。

问题

即使我们只返回70行,也会进行大量的IO和排序。这当然是有道理的。

这总是会对磁盘队列造成一些轻微的尖峰。当我们达到300万个潜在客户时,它开始放慢速度,现在我们已经接近5,磁盘队列有时会挂起一两秒或两个。

这实际上仍然是可行的,但是这个系统还有另一个区域,它有一个时间敏感的过程,简单来说,它是一个Web服务,需要非常快速地提供响应,否则会导致另一个超时结束。磁盘队列峰值导致该部分陷入停滞,这导致下游超时。最终的结果实际上是我们基于VoiceXML的自动IVR中的电话掉线,这对我们来说非常糟糕。

我们尝试过什么

我们尝试过:

  • 将系统中的潜在客户数量减少到最低限度的维护任务。
  • 添加了明显的索引来提供帮助。
  • 在分析器中运行索引调整向导并应用其大部分建议。其中一个或多或少会在索引中重现整个表格,所以我手动调整它以做一点不到。
  • 为服务器添加了更多RAM。它有点低,但现在它总是有8个演出空闲,并且SQL服务器配置为使用不超过8演出,但它从不使用超过2或3.我发现这很奇怪。为什么不把整个表放在RAM中呢?它只有500万条线索,而且还有足够的空间。
  • 倾注查询执行计划。我可以看到,在这一点上,索引似乎主要是在完成他们的工作 - 大约90%的工作是在分拣阶段发生的。
  • 考虑将Leads表分区为不同的物理驱动器,但我们没有相应的资源,似乎没有必要。

结束......

我的一部分感觉服务器应该能够处理这个问题。考虑到该服务器的强大功能,500万条记录并不是那么多,这是一个体面的四核,有16个内存。但是,我可以看到排序部分如何触及数百万行只是为了返回少数几行。

那你在这样的情况下做了什么?我的直觉是我们应该削减一些功能,但是如果有办法保持这种功能,这将为我节省与业务部门的战争。

提前致谢!

3 个答案:

答案 0 :(得分:3)

通过改进SQL查询,可以经常改善数据库瓶颈。如果不知道它们是什么样的,请考虑创建一个可按计划填充的运营数据存储或数据仓库。

有时可以将复杂的关系数据库弄平。它可以使查询运行得更快,并且可以更轻松地优化查询,因为模型非常平坦。这也可以使您更容易确定是否需要向上或向外扩展数据库服务器。容量和增长分析可能有助于进行该呼叫。

事务性/高度规范化的数据库通常不像ODS或数据仓库那样可扩展。

编辑:您的ORM可能也有可能支持的优化,这可能值得研究,而不仅仅是研究如何优化它发送到您的数据库的查询。也许完全绕过您的ORM报告可能是一种完全控制您的查询以获得更好性能的方法。

答案 1 :(得分:2)

  1. 确定最有可能运行哪些即席查询或使用存储过程限制搜索条件..您可以汇总数据吗?对待此 应用程序像数据仓库。
  2. 在搜索中涉及的每个列上创建索引以避免表扫描。
  3. 在表达式上创建片段。
  4. 定期重新编译数据并在加载更多潜在客户时更新统计信息。
  5. 将查询(结果集)创建的临时文件放在ramdisk中。
  6. 考虑迁移到像Informix OnLine这样的高性能RDBMS引擎。
  7. 启动另一个线程,以便在查询时从结果集开始显示N行 继续执行。

答案 2 :(得分:2)

考虑您的ORM如何创建查询。 如果您的搜索性能较差,也许您可​​以尝试使用存储过程返回结果,并在必要时使用专门针对哪些搜索条件定制的多个存储过程。