微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ASP.NET / SQL 2008性能问题

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

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

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

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

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

问题

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

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

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

我们尝试过什么

我们尝试过:

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

在结束…

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

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

提前致谢!

解决方法

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

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

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

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

原文地址:https://www.jb51.cc/aspnet/248187.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐