【发布时间】:2015-08-08 08:46:06
【问题描述】:
情况
有两种应用:
- Windows 服务
- 处理队列消息
- 执行大量数据库 I/O (SELECT/UPDATE/INSERT)
- ASP.NET 应用程序
- 主要使用数据库进行 SELECT 查询
这两个应用程序都使用一个(镜像)MSSQL 数据库 (SQL Server 2014)。我们使用 NHibernate ORM 查询数据。应用程序和数据库服务器都有自己的专用服务器。
问题
数据库中有数百万条记录,因此只有有足够的可用索引才能进行查询。 Windows 服务主要使用聚集索引进行查询,但有很多非聚集索引用于查询 Web 应用程序中的其他字段。 Windows 服务应该尽可能快。
- 这些非聚集索引使更新和插入查询变慢。
- Web 应用程序的使用对服务性能有很大影响。
到目前为止我们的解决方案
- 向上扩展服务器
- 存档数据
- 改进索引
问题
除了我们目前的努力之外,还有其他解决方案吗?我们不想添加额外的服务器,我们想使用新的架构或软件来解决这个问题。在理想情况下,使用 Web 应用程序根本不会影响 Windows 服务的性能。
【问题讨论】:
-
您的问题是 asp.net 查询阻塞了服务还是其他问题?查看计划缓存以获取最昂贵的查询和等待统计信息可能是个好主意。
-
我的瓶颈是硬盘 io(数据库)。如果有办法不使用 Web 应用程序中的数据库,同时仍然拥有最新数据(不超过几分钟),我会喜欢的。
-
如果实际的磁盘 I/O 是只读查询的问题,asp.net 查询是否从磁盘读取所有内容?更多内存是否有助于将所有内容保存在缓存(缓冲池)中?
-
如果问题是内存不足,Page Life Expectancy 可能会显示它,例如使用:blog.sqlauthority.com/2010/12/13/…
-
如果您没有这样做,那么从计划缓存中查看具有大多数逻辑读取的查询也可能会有所帮助。有时,如果在搜索条件中存在 varchar 与 nvarchar 问题或使用非最佳索引/计划时,实际可以读取多少内容会令人惊讶。
标签: .net sql-server performance nhibernate architecture