【问题标题】:Is it feasible to improve performance of SQL server with caching?通过缓存提高 SQL Server 的性能是否可行?
【发布时间】:2012-02-24 21:10:23
【问题描述】:
提高 SQL Server 2008R2 数据库和 .Net 3.5 应用程序速度的最常见且易于实施的解决方案是什么。
我们有一个具有以下属性的应用程序:
- 少量同时客户端(最多 200 个)。
- SQL 服务器端的复杂数学运算
- 我们正在模仿oracle的row-level security(因此使用tvf和storedprocs而不是直接查询表)
- 主要问题是用户执行了大量的更新/插入/删除/计算,他们吓坏了,因为他们需要在这些操作完成时等待页面重新加载。
我需要澄清的问题如下:
- 更快的是:从 sql server 返回整个数据集并在 C# 端执行数学函数,或在 sql 端执行计算函数(因此,不返回额外的列)。还是仅依赖于硬件?
- 缓存会提高性能(例如,如果我们添加 redis 缓存)。还是仅适用于大量客户端的缓存解决方案?
- 预先计算一些数据并将其存储在数据库中的某个位置是一种不好的做法(因此,当用户请求时,它已经被计算过了)。或者这就是缓存应该做的事情?如果这不是一个不好的做法,那么如何配置 SQL Server 在有可用资源时进行计算?
- 如果缓存仍需要访问数据库并查看是否有任何记录更新,缓存如何提高性能?
也欢迎提出一般性建议和cmets。
【问题讨论】:
标签:
c#
.net
sql
sql-server-2008-r2
redis
【解决方案1】:
让我们将答案分为两部分,即查询执行性能和缓存以提高性能。
我认为您应该从解决 SQL 服务器上的负载开始,并尝试最大限度地优化在其上运行的进程,这应该可以解决大部分实现任何缓存的需求。
从您的问题看来,您有一个既用于事务处理又用于聚合/计算的系统,当这两个任务相互锁定资源时,这通常会导致冲突。执行数学运算的长查询可能会锁定/保持 UI 所需的对象。
优化这些系统以并行工作并提高查询效率是提高性能的关键。
首先,我将使用您的问题。什么更快?取决于您正在执行的实际聚合,如果您正在处理一组操作,即列的 SUM/AVG,请将其保存在 SQL 中,另一方面,如果您发现自己在过程中有游标,请将其移动到C#。光标会扼杀你的表现!
您问将数据汇总到一边并稍后查询该存储库是否是不好的做法,这是最佳做法:)。您最终将拥有一个满足事务性、高节奏客户的数据库和另一个存储聚合信息的数据库,这将快速轻松地满足您的其他需求。将其带入下一步将导致您拥有一个数据仓库,因此当您拥有大量信息和计算时,这绝对是您想要的方向。
最后,缓存,这很棘手,实际上取决于您需求的具体性质,我会说采用上述方法,花时间改进流程,我希望最终结果会使缓存变得多余。
您最好的朋友之一是 SQL Profiler,在 stmt:completed 上运行跟踪以查看最高持续时间/io/cpu 并首先选择它们。
祝你好运!