2天时间,聊今年最热的 Agent、上下文工程、AI 产品创新等话题。2025 年最后一场~ 了解详情
写点什么

如何缓存存储过程的结果

  • 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:502142
用户头像

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

关注

评论

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

零踩坑!Figma组件库无损迁移全流程图解(2025版)

职场工具箱

效率工具 产品经理 产品设计 figma ui设计

深度拆解UI智能设计:如何用D2C设计稿转代码,实现产设研一体化

职场工具箱

AI 产品经理 产品设计 ui设计 设计稿转代码

观安信息新一代政务数据共享交换平台

极客天地

焱融科技携手信通院、青云科技启动“AI推理高性能存储技术推进计划”

焱融科技

人工智能 大模型推理 焱融存储 KVCache

《开源鸿蒙共建地图4.0》发布 加速构建面向万物互联的操作系统能力

最新动态

Golang基础笔记十四之文件操作

Hunter熊

golang 后端 文件写入 文件读取

MyEMS能源管理系统后台配置-空间管理

开源能源管理系统

开源 能源管理系统

JNPF组织权限,让企业权限体系更清晰高效​

引迈信息

拯救重复劳动:无代码实现 Markdown 图&表抽取

数由科技

人工智能 markdown 数据科学 ETL 无代码

90%企业误解的低代码真相,已经不单纯了

秃头小帅oi

唯一中资厂商!腾讯云连续三年入选 Gartner® CPaaS 魔力象限“挑战者”,AI 实践与国际化布局成效显著

极客天地

代码智能化在互联网大厂的规模化落地实践

思码逸研发效能

人工智能 研发效能 智能代码 研发效能管理 AI 编程

快手DHPS:国内首个实现基于RDMA 通信的可负载均衡高性能服务架构!

快手技术

高性能 服务架构 快手 RDMA技术

客户为纲,万目皆张——中烟创新致烟草客户的一封信

中烟创新

BOE(京东方)携手生态伙伴推出公益微电影 见证“照亮成长路”十年科技赋能教育之路

爱极客侠

抖音集团基于Flink的亿级RPS实时计算优化实践

Apache Flink

大数据 flink 实时计算 实时处理

bsfgo 一个轻量级的go web框架

车江毅

开源鸿蒙走进地方开源生态建设交流会:政企办公应用落地牵引开源创新

最新动态

Promtail 对接日志最佳实践

观测云

日志分析

多语种AI舆情监测的关键技术与挑战

沃观Wovision

NLP 大模型 海外舆情 AI 大模型 沃观Wovision 舆情监测系统

亚太企业AI应用现状---- 理想丰满、现实骨感

财见

李沐团队开源音频模型 Higgs Audio V2,基于千万小时数据训练;生数科技发布长时文生音频系统 FreeAudio丨日报

声网

2025年4月补丁星期二安全更新全景

qife122

网络安全 漏洞修复

NineData新增SQL Server到MySQL复制链路,高效助力异构数据库迁移

NineData

MySQL 数据库迁移 数据复制 NineData SQL Server

6 款支持角色权限控制(RBAC)的开发工具对比与应用场景解析

NocoBase

开源 权限管理 rbac 身份管理 角色管理

BOE(京东方)携多领域商显解决方案亮相InfoComm Asia 2025 “科技+绿色”引领万物互联新时代

爱极客侠

2025年6月补丁星期二:微软修复67个漏洞,包含2个零日漏洞

qife122

漏洞管理 Windows安全

发布即颠覆?实测smardaten 2.0 :当 AI 遇上无代码软件开发,真的能重新定义 “对话即开发”

程序员洲洲

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