我们开发了一个带有搜索界面的系统,看起来像这样:
http://demo1.nsourceservices.com/images/logos/stackoverflow1.png
如您所见,有一些相当严肃的搜索功能。您可以使用状态,渠道,语言,广告系列类型的任意组合,然后按名称等缩小范围。
然后,一旦您搜索到并且在底部弹出了潜在客户,您就可以对标题进行排序。
查询使用ROWNUM来执行分页方案,因此我们一次只返回70行。
问题
即使我们只返回70行,也会进行大量的IO和排序。这当然是有道理的。
这总是会对磁盘队列造成一些轻微的尖峰。当我们达到300万个潜在客户时,它开始放慢速度,现在我们已经接近5,磁盘队列有时会挂起一两秒或两个。
这实际上仍然是可行的,但是这个系统还有另一个区域,它有一个时间敏感的过程,简单来说,它是一个Web服务,需要非常快速地提供响应,否则会导致另一个超时结束。磁盘队列峰值导致该部分陷入停滞,这导致下游超时。最终的结果实际上是我们基于VoiceXML的自动IVR中的电话掉线,这对我们来说非常糟糕。
我们尝试过什么
我们尝试过:
结束......
我的一部分感觉服务器应该能够处理这个问题。考虑到该服务器的强大功能,500万条记录并不是那么多,这是一个体面的四核,有16个内存。但是,我可以看到排序部分如何触及数百万行只是为了返回少数几行。
那你在这样的情况下做了什么?我的直觉是我们应该削减一些功能,但是如果有办法保持这种功能,这将为我节省与业务部门的战争。
提前致谢!
答案 0 :(得分:3)
通过改进SQL查询,可以经常改善数据库瓶颈。如果不知道它们是什么样的,请考虑创建一个可按计划填充的运营数据存储或数据仓库。
有时可以将复杂的关系数据库弄平。它可以使查询运行得更快,并且可以更轻松地优化查询,因为模型非常平坦。这也可以使您更容易确定是否需要向上或向外扩展数据库服务器。容量和增长分析可能有助于进行该呼叫。
事务性/高度规范化的数据库通常不像ODS或数据仓库那样可扩展。
编辑:您的ORM可能也有可能支持的优化,这可能值得研究,而不仅仅是研究如何优化它发送到您的数据库的查询。也许完全绕过您的ORM报告可能是一种完全控制您的查询以获得更好性能的方法。
答案 1 :(得分:2)
答案 2 :(得分:2)
考虑您的ORM如何创建查询。 如果您的搜索性能较差,也许您可以尝试使用存储过程返回结果,并在必要时使用专门针对哪些搜索条件定制的多个存储过程。