写点什么

如何缓存存储过程的结果

  • 2014-03-31
  • 本文字数:1332 字

    阅读完需:约 4 分钟

Brent Ozar 是咨询公司 Brent Ozar Unlimited 的创始人和负责人,同时也是一名微软最有价值专家和 SQL Server DBA。他发表了一篇博文,介绍一种缓存存储过程结果的方案及应用场景。

在文章开头,他给出了这样一个场景:一家在线商店需要在每个物品的页面上显示用户买过的相关产品。他认为,在完美的世界中,这些数据应该在 Web/ 应用层缓存。但是,有时候,开发人员会构建存储过程来获取这类数据,而最终存储过程的调用过于频繁。

Brent 指出,对于这种已经使用了存储过程的情况,可以构建一个缓存供存储过程使用。

假如加入缓存层之前的代码如下:

复制代码
CREATE PROCEDURE dbo.usp_GetRelatedItems
@ItemID INT AS
BEGIN
SELECT RelatedItemID,RelatedItemName
FROM dbo.BigComplicatedView
WHERE SoldItemID=@ItemID;
END
GO

代码一:原来的存储过程

则加入缓存层之后的代码如下:

复制代码
CREATE PROCEDURE dbo.usp_GetRelatedItems
@ItemID INT AS
BEGIN
IF EXISTS(SELECT * FROM Cache.dbo.GetRelatedItems
WHERE ItemID=@ItemID)
SELECT *
FROM Cache.dbo.GetRelatedItems
WHERE ItemID=@ItemID
ELSE
SELECT RelatedItemID,RelatedItemName
FROM dbo.BigComplicatedView
WHERE SoldItemID=@ItemID;
END
GO

代码二:实现缓存(一)

代码二引入了一个新表 Cache.dbo.GetRelatedItems,其中 Cache 是新建的数据库。该表中的列比 usp_GetRelatedItems 的返回结果多了一个输入字段和一个 ID,其格式如下:

该表中的数据可以根据需要每天晚上或者每周进行一次 truncate。另外,在实际工作中实现这样一个方案时,他还会根据大量 A/B 性能测试的结果创建恰当的聚簇索引。

代码二并未对缓存表进行操作。如果数据没有缓存,其实需要将其插入缓存表,代码如下:

复制代码
CREATE PROCEDURE dbo.usp_GetRelatedItems
@ItemID INT AS
BEGIN
/* 查看待查找的记录是否已经缓存 */
IF NOT EXISTS(SELECT * FROM Cache.dbo.GetRelatedItems
WHERE ItemID=@ItemID)
BEGIN
/* 缓存中没有记录,因此插入缓存 */
INSERT INTO Cache.dbo.GetRelatedItems
(ItemID,RelatedItemID,RelatedItemName)
SELECT RelatedItemID,RelatedItemName
FROM dbo.BigComplicatedView
WHERE SoldItemID=@ItemID;
END
/* 从缓存中获取记录 */
SELECT *
FROM Cache.dbo.GetRelatedItems
WHERE ItemID=@ItemID
END
GO

代码三:实现缓存(二)

他承认,这种做法会增加 SQL Server 的写负载,但他只有在面临下面这些情况时才使用这种方案:

  • 操作极为密集但只读的存储过程
  • 调用非常频繁(每分钟几百或几千次)
  • 其结果变化频率少于每天一次(或者不关心实时精度)
  • 业务需要非常快的系统改进速度,没有时间等着开发人员实现一个缓存层

最后,他指出,这只是紧急情况下让业务恢复运行的一种创可贴式方案。另外,他还推荐了一些与缓存相关的资源,包括最快的查询是不用执行的那个选择缓存方式通过缓存让系统更好地运行。有兴趣的读者可以进一步阅读。


感谢包研对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。

2014-03-31 07:502190
用户头像

发布了 256 篇内容, 共 101.1 次阅读, 收获喜欢 12 次。

关注

评论

发布
暂无评论
发现更多内容

云电脑云手机相继亮相,传统PC会被淘汰吗?

青椒云云电脑

云电脑

私有云厂商怎么选?私有云三大技术盘点

青椒云云电脑

私有云 私有云厂商

技术升级,详解私有云轻运维模式

青椒云云电脑

私有云 云桌面

鸿蒙开发套件之DevEco Profiler助您轻松分析应用性能问题

HarmonyOS开发者

HarmonyOS

微服务回归单体,是技术架构倒退?我看未必!

雾岛听风(锋)

ARTS-WEEK5-23.9.11~23.9.17

Echo!!!

引领PC行业大步向前,英特尔做了哪些努力?

E科讯

英特尔以全栈式产品组合,驱动云服务和AI产业发展

E科讯

Meetup 回顾|Data Infra 研究社第十五期(含资料发布)

Databend

语音合成技术的应用与挑战

数据堂

D-SMART对接OceanBase4 看 OB的可观测性:值得夸赞的和要吐槽的都不少

DBAIops社区

DBAIops D-SMART

基于深度学习的语音合成技术的进展与未来趋势

数据堂

低代码:简化开发流程,提高工作效率

树上有只程序猿

低代码 应用开发 JNPF

实施全面预算管理 健全企业内部控制

智达方通

内部控制 企业内部控制 全面预算管理 全面预算管理系统

“存量竞争” 体验为王,火山引擎边缘云助力内容社区破局

火山引擎边缘云

CDN 边缘计算 加速 边缘云

企业直播为什么要选择私有云

青椒云云电脑

私有云 私有云平台

告别烟囱式建设,DT时代同样需要操作系统

极客天地

为什么工厂要部署私有云

青椒云云电脑

私有云

吃货大作战!华为Mate 60负一屏点外卖每天狂送优惠!

最新动态

为什么云办公模式必选云桌面

青椒云云电脑

云桌面 云桌面解决方案

新基建加码,私有云成传统基建升级首选

青椒云云电脑

桌面云 云桌面

语音合成技术的简介与未来发展

数据堂

奇点云:企业级数据基础设施的设计思路是“操作系统”

奇点云

AI 奇点云 数据云操作系统

倒计时7天!2023 PRO_大会:这些PRO,如“7”而至!

ToB行业头条

Canvas 低代码工具,多人自研开发全流程优化|ModelWhale 版本更新

ModelWhale

云计算 Jupyter Notebook canvas 数据驱动 在线编程

用户指南系列 | 使用 Greptime 官方工具高效地进行 PromQL 查询

Greptime 格睿科技

数据库 软件 云原生

Footprint Analytics 与 Xterio 携手合作,将推动 Web3 游戏领域的数据驱动革命

Footprint Analytics

区块链 web3

如何缓存存储过程的结果_语言 & 开发_马德奎_InfoQ精选文章