Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 如何防止两个应用程序冲突,因为它们使用一个数据库? 处境_.net_Sql Server_Performance_Nhibernate_Architecture - Fatal编程技术网

.net 如何防止两个应用程序冲突,因为它们使用一个数据库? 处境

.net 如何防止两个应用程序冲突,因为它们使用一个数据库? 处境,.net,sql-server,performance,nhibernate,architecture,.net,Sql Server,Performance,Nhibernate,Architecture,有两个应用程序: Windows服务 处理队列消息 执行大量数据库I/O(选择/更新/插入) ASP.NET应用程序 主要使用数据库进行选择查询 两个应用程序都使用一个(镜像)MSSQL数据库(SQL Server 2014)。我们使用NHibernate ORM查询数据。应用程序和数据库服务器都有自己的专用服务器 问题 数据库中有数百万条记录,因此只有在有足够的索引可用时,查询才能工作。Windows服务主要使用聚集索引进行查询,但有许多非聚集索引用于查询web应用程序中的其他字段

有两个应用程序:

  • Windows服务
    • 处理队列消息
    • 执行大量数据库I/O(选择/更新/插入)
  • ASP.NET应用程序
    • 主要使用数据库进行选择查询
两个应用程序都使用一个(镜像)MSSQL数据库(SQL Server 2014)。我们使用NHibernate ORM查询数据。应用程序和数据库服务器都有自己的专用服务器

问题 数据库中有数百万条记录,因此只有在有足够的索引可用时,查询才能工作。Windows服务主要使用聚集索引进行查询,但有许多非聚集索引用于查询web应用程序中的其他字段。Windows服务应该尽可能快

  • 这些非聚集索引使更新和插入查询变慢
  • web应用程序的使用对服务性能有很大影响
我们迄今为止的解决办法
  • 扩大服务器规模
  • 归档数据
  • 改进索引
问题:
除了我们目前的努力,还有其他解决方案吗?我们不想添加额外的服务器,我们想使用新的体系结构或软件来解决这个问题。在理想情况下,使用web应用程序根本不会影响Windows服务的性能。

这不是一个理想情况。桌子上的任何活动都会影响其他活动

正如您所知,索引会减慢插入、更新和删除的速度

索引维护将有所帮助(碎片整理)

填充系数小于100将有所帮助(如50)

尝试按主键的顺序执行插入
如果不是,则按尽可能多的索引顺序排列PK

尽可能设置基本更新、插入和删除
一次获得一个写锁和1000个插入比一个更有效

Web应用程序的主要影响是它需要锁。
你有选择……的选项吗。。。。有(无锁)?

With(nolock)为脏读,因此请谨慎使用

除了布拉姆的建议之外,您可能还需要研究ASP.NET应用程序的缓存读取,可能需要使用ASP.NET的缓存类:-请参阅以获取实现示例

如果您可以容忍脏读(可能是这样,也可能不是这样-应用程序用户可以看到部分更新的数据吗?),您可以将此与
SELECT。。。使用(NOLOCK)

基本的想法是,您的数据库只会每隔5分钟左右(但对于较大的读取)被Web应用程序访问一次,而不是实时访问。这里的问题是每5分钟需要缓存多少数据。如果您可以将用户使用的大部分数据缓存在大小合理的缓存中,那就太好了。您可以采取以下几种策略:

  • 只缓存不经常更改的数据,并且更新该缓存的频率较低
  • 仅缓存与最近更新的对象/实体相关的数据
  • 仅缓存站点经常请求的数据
所有这些都需要对ASP应用程序何时以及如何进入数据库进行一些分析


您还可以将其与轮询模式相结合,以进一步改进,即当服务更新数据库中的实体时,它还会在另一个表中创建一条记录,您的ASP.NET应用程序正在轮询该记录,以使缓存保持最新。轮询表将包含一个主密钥(或一组密钥)来访问实体,因此ASP缓存更新程序只能请求那些过期的实体。

您没有说明您使用的SQL Server版本,也没有描述您的HDD方案(共享存储、本地存储等),但您确实说过HDD是瓶颈(不是内存,对吗?),但没有说明这是由于写入还是写入+读取造成的。但是,由于您的要求是只落后几分钟,并且您不想引入报表服务器-如果您使用的是SQL 2012,您可以将AlwaysOn与异步副本一起使用,只需确保辅助副本位于与主数据库不同的磁盘集上。通过分离辅助数据库时,读操作不会与写操作发生冲突,但仍比主数据库晚几秒钟。

您的问题是asp.net查询阻塞了服务还是其他什么?查看计划缓存中最昂贵的查询和等待统计信息可能是个好主意。我的瓶颈是hdd io(数据库)。如果有一种方法可以在保留最新数据(不超过几分钟后)的情况下不使用web应用程序中的数据库,我会很高兴。如果实际的磁盘I/O是只读查询的问题,asp.net查询是否从磁盘读取所有内容?更多的内存是否有助于将所有内容保留在缓存(缓冲池)中?如果问题是内存不足,则页面预期寿命可能会暴露出来,例如,使用:如果您没有这样做,查看具有计划缓存中大多数逻辑读取的查询也可能会有所帮助。有时,如果搜索条件或非最佳索引中存在varchar vs nvarchar问题,那么实际读取的内容量会令人惊讶/使用中的计划。作为警告,nolock也可以(很少)因为你要么读同一行两次,要么完全漏掉一行——如果问题不是阻塞,nolock可能帮不上忙他几乎肯定有阻塞问题,因为他有一个经常向表中写入内容的服务和一个经常从表中读取内容的网站。但是,是的,nolock应该小心使用。这是我第一次访问同样,也应该检查阻塞查询的索引使用情况/查询计划——这可能比试图解决它要简单得多,也要便宜得多。今天晚些时候我会更深入地研究您的答案,但我认为缓存不会有多大帮助。许多查询都不是p