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