c# - 通过缓存提高SQL Server的性能是否可行?

标签 c# .net sql sql-server-2008-r2 redis

提高 SQL Server 2008R2 数据库和 .Net 3.5 应用程序速度的最常见且最容易实现的解决方案是什么。

我们有一个具有以下属性的应用程序:
- 少量并发客户端(最多约 200 个)。
- SQL 服务器端的复杂数学运算
- 我们正在模仿 oracle 的 row-level security (因此使用 tvf 和 storedprocs 而不是直接查询表) - 主要问题是用户执行大量更新/插入/删除/计算,他们 panic ,因为他们需要在完成这些操作时等待页面重新加载。

我需要澄清的问题如下:

  1. 什么更快:从 sql server 返回整个数据集并在 C# 端执行数学函数,或在 sql 端执行计算函数(因此,不返回额外的列)。还是仅取决于硬件?
  2. 缓存会提高性能吗(例如,如果我们添加 redis 缓存)。或者缓存解决方案仅适用于大量客户端?
  3. 预先计算一些数据并存储在数据库中的某个地方是否是一种不好的做法(因此,当用户请求时,它已经被计算)。或者这就是缓存应该做的?如果这不是一个坏习惯,您如何配置 SQL Server 在有可用资源时进行计算?
  4. 如果仍然需要访问数据库并查看是否有更新的记录,缓存如何提高性能?

也欢迎提出一般建议和意见。

最佳答案

让我们将答案分为两部分,查询执行的性能和缓存以提高性能。 我相信您应该从解决 SQL Server 上的负载开始,并尝试最大限度地优化在其上运行的进程,这应该可以解决实现任何缓存的大部分需求。

从您的问题看来,您有一个既用于事务处理又用于聚合/计算的系统,当这两个任务相互锁定资源时,这通常会导致冲突。执行数学运算的长查询可能会锁定/保留 UI 所需的对象。 优化这些系统以并行工作并提高查询效率是提高性能的关键。

首先,我将使用您的问题。什么更快?取决于您正在执行的实际聚合,如果您正在处理一组操作,即列的 SUM/AVG,请将其保留在 SQL 中,另一方面,如果您发现自己在过程中有游标,请将其移动到C#。光标会扼杀你的表现! 您询问将数据放在一边并稍后查询该存储库是否是一种不好的做法,这是最佳做法:)。您最终将拥有一个满足事务性、高节奏客户需求的数据库,以及另一个存储聚合信息的数据库,这将可以快速轻松地满足您的其他需求。将它带到下一步将导致您拥有一个数据仓库,因此当您拥有大量信息和计算时,这绝对是您想要前往的地方。

最后,缓存,这很棘手,实际上取决于您需求的具体性质,我会说采用上述方法,花时间改进流程,我预计最终结果将使缓存变得多余。

执行该任务的最好 friend 之一是 SQL Profiler,在 stmt:completed 上运行跟踪以查看最高持续时间/io/cpu 是什么,然后首先选择它们。

祝你好运!

关于c# - 通过缓存提高SQL Server的性能是否可行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9438096/

相关文章:

c# - 创建动态 WPF 上下文菜单

sql - 如何在 R 中对 data.table 进行基本的左外连接?

c# - 浮点差异取决于调试构建的运行方式

c# - 如何强制用户在 Visual Studio for C# 中记录类成员?

C# Array.Contains() 编译错误

c# - linq 问题 : querying nested collections

sql - 通过连接多列删除查询

java - 无法从 Android 连接到 SQL 服务器

c# - 异常 : Correlation failed. 未知位置

C# 和 Moq - 如何断言未引发事件