.net - 如何防止两个应用程序因使用同一个数据库而发生冲突?

标签 .net sql-server performance nhibernate architecture

情况

有两个应用程序:

  • Windows 服务
    • 处理队列消息
    • 执行大量数据库 I/O(SELECT/UPDATE/INSERT)
  • ASP.NET 应用程序
    • 主要使用数据库进行 SELECT 查询

两个应用程序都使用一个(镜像)MSSQL 数据库 (SQL Server 2014)。我们使用 NHibernate ORM 查询数据。应用程序和数据库服务器都有自己的专用服务器。

问题

数据库中有数百万条记录,因此只有在有足够的可用索引时查询才有效。 Windows Service大多使用聚集索引进行查询,但在Web应用程序中也有很多非聚集索引用于查询其他字段。 Windows 服务应该尽可能快。

  • 这些非聚集索引会使更新和插入查询变慢。
  • 网络应用程序的使用对服务性能有很大影响。

迄今为止我们的解决方案

  • 扩展服务器
  • 存档数据
  • 改进索引

问题

除了我们目前的努力之外,还有其他解决方案吗?我们不想添加额外的服务器,我们希望使用新的架构或软件来解决这个问题。在理想情况下,使用 Web 应用程序根本不会影响 Windows 服务的性能。

最佳答案

这不是一个理想的世界。 table 上的任何事件都会影响其他事件。

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

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

填充因子小于 100 会有帮助(例如 50)

尝试按照PK的顺序执行插入
如果不是按照尽可能多的索引顺序PK

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

Web 应用程序的主要影响是它会锁定。
您可以选择 select .... with (nolock) 吗?
with (nolock) 是脏读所以只能谨慎使用。

关于.net - 如何防止两个应用程序因使用同一个数据库而发生冲突?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30462580/

相关文章:

c# - 时间跨度的总和差异,按每年的旅行天数排序

Javascript对象按日、月、年分组

c# - 如何反序列化有时是空数组有时是字符串值的 JSON 数据

.net - Powershell System.IO.StreamReader 读取方法

c# - 什么可能导致使用 C# 从 Gmail SMTP 发送的邮件无法到达 - 不会引发异常

c# - LINQ to SQL DataContext.Translate 和名称与源名称不同的属性

c# - 在 ASP.NET Web 应用程序中将架构名称添加到 SQL 表名称

sql-server - 从一个 SQL 数据库导出大量二进制数据并将其导入到具有相同架构的另一数据库

java - 提高非常大的数字的加法性能

performance - 我的C++应用程序在Docker容器中运行速度较慢