Sql server 在SQLServer中使用缓存表,我疯了吗?

Sql server 在SQLServer中使用缓存表,我疯了吗?,sql-server,caching,Sql Server,Caching,我有一个有趣的熟食。我有一个非常昂贵的查询,需要进行几个完整的表扫描和昂贵的联接,还需要调用一个计算一些地理空间数据的标量UDF 最终结果是一个resultset,其中包含呈现给用户的数据。但是,我不能在一次调用中返回我想要向用户显示的所有内容,因为我将原始结果集细分为多个页面,只返回一个指定的页面,而且我还需要获取原始的整个数据集,并应用group by和JOIN等来计算相关的聚合数据 长话短说,为了将我需要的所有数据绑定到UI,这个昂贵的查询需要调用大约5-6次 因此,我开始思考如何计算这个

我有一个有趣的熟食。我有一个非常昂贵的查询,需要进行几个完整的表扫描和昂贵的联接,还需要调用一个计算一些地理空间数据的标量UDF

最终结果是一个resultset,其中包含呈现给用户的数据。但是,我不能在一次调用中返回我想要向用户显示的所有内容,因为我将原始结果集细分为多个页面,只返回一个指定的页面,而且我还需要获取原始的整个数据集,并应用group by和JOIN等来计算相关的聚合数据

长话短说,为了将我需要的所有数据绑定到UI,这个昂贵的查询需要调用大约5-6次

因此,我开始思考如何计算这个昂贵的查询一次,然后每个后续调用都可以以某种方式利用缓存的结果集

我突然想到了将查询抽象成一个存储过程的想法,该过程将接受一个CacheID(Guid)作为一个可为空的参数

此存储过程将使用cacheID将结果集插入到缓存表中,以唯一标识此特定结果集

这允许需要处理此resultset的存储过程从以前的查询传入cacheID,并且检索数据是一个简单的SELECT语句(cacheID上有一个WHERE子句)

然后,使用定期SQL作业清除缓存表

这非常有效,并且在零负载测试中确实加快了速度。但是,我担心这种技术可能会在负载下导致对缓存表进行大量读写的问题

长话短说,我疯了吗?或者这是个好主意


显然,我需要担心锁争用和索引碎片,但还有什么需要担心的吗?

我以前做过,尤其是当我没有能力编辑应用程序时。我认为这有时是一种有效的方法,但一般来说,最好在应用程序中使用缓存/分布式缓存,因为它可以更好地减少数据库上的负载并更好地扩展

简单的“只在应用程序中执行”解决方案的棘手之处在于,很多时候,如果没有应用程序消息总线(或类似memcached的东西),多个应用程序与数据库交互会使您陷入困境,因为每个应用程序都有一个缓存可能会很昂贵


显然,对于您的问题,理想的解决方案是能够以更便宜的方式进行分页,而不需要为了获得第N页而翻阅所有数据。但有时这是不可能的。请记住,从数据库中流出的数据流比从数据库中流出的数据流回到同一个数据库要便宜。您可以引入一个负责执行这些长查询的新服务,然后让您的主应用程序通过该服务与db进行对话

你的tempdb可能会在负载下疯狂膨胀,所以我会看。将昂贵的联接放在视图中并为视图编制索引可能比尝试为每个用户缓存表更容易。

然后我必须将数千个结果通过管道传回应用程序?更详细地说,我对这些数据执行了大量SQL操作,然后将结果发送到应用程序。因此,在应用程序中缓存可能会适得其反。“FlySwat,我认为引入中间人这一点可能是值得考虑的,您不希望每次执行长时间运行的报告时将您的DB发送到合适的位置,中间的服务将使您能够在DB上节流和减少负载。“从数据库中流出的数据流比从数据库中流出的数据流回到同一个数据库要便宜“你能详细说明一下吗?结果是非常随意的,并且基于大量的输入参数,因此视图将是巨大的。这也是我的第一个想法,但我意识到,要想做到这一点,视图需要数百万行。@FlySway,数百万行并不一定那么糟糕。尤其是在一天结束时,您可以更好地在db上分配负载,并整体降低负载。