AICon 深圳站 Keynote 嘉宾官宣!共探AI价值转化的实践路径 了解详情
写点什么

如何缓存存储过程的结果

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

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

关注

评论

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

LSP协议:技术创新背后的团队与愿景

股市老人

MES系统如何帮助企业提高生产效率

万界星空科技

制造业 mes 万界星空科技mes 生产管理MES系统

RPA技术实操指南:企业降本增效全攻略

八爪鱼采集器︱RPA机器人

RPA 自动化 RPAxAI

一线实战:运维人少,我们是如何从 0 到 1 实践 DevOps 和云原生?

阿里巴巴云原生

阿里云 云原生

从 7000 余项目脱颖而出,飞轮科技《新一代实时分析数据仓库解决方案》荣获 HICOOL 2024 全球创业大赛二等奖

SelectDB

数据仓库 数据分析 Hicool 大数据 开源

智IN共创 境界无限:2024英特尔中国学术峰会开幕

E科讯

企业级低代码解决方案:JNPF平台深度解析

不在线第一只蜗牛

低代码 数字化转型 企业转型

RPA和BPM:优势与特点详解

八爪鱼采集器︱RPA机器人

RPA 自动化 RPAxAI

RPA原理:简单了解RPA发展及相关知识

八爪鱼采集器︱RPA机器人

RPA 自动化 RPAxAI

一线实战:运维人少,我们是如何从 0 到 1 实践 DevOps 和云原生?

阿里云云效

阿里云 云原生

文心智能体平台已入驻60万开发者,合作10万企业

极客天地

在 DataOps 体系建设中,主动元数据是何角色?

Aloudata

数据治理 Data 元数据 DataOps

谷歌发布 3 款 Gemini 新模型;字节开源 FLUX Dev Hyper SD Lora,8 步生图丨 RTE 开发者日报

声网

Flink优化之--旁路缓存和异步IO

数新网络官方账号

flink

一文带你了解可观测领域中APM与eBPF的技术差异

乘云数字DataBuff

APM #ebpf

易观分析:2024年第2季度中国图书电商市场交易规模达266.2亿元 市场收缩引发行业隐忧

易观分析

深入解析RPA:概念、应用和前景一网打尽

八爪鱼采集器︱RPA机器人

RPA 自动化 RPAxAI

数据迁移新技能,MongoDB轻松同步至ClickHouse

RestCloud

数据库 mongodb ETL 数据集成 Click house

基于LangChain手工测试用例转Web自动化测试生成工具

霍格沃兹测试开发学社

KubeCon China 2024|技术与产业双向驱动,华为云持续开源创新,加速全球智能化升级

华为云原生团队

云计算 容器 云原生

SQL 进阶与 MySQL 进阶管理指南

测吧(北京)科技有限公司

测试

如何将文本转换为向量?(方法四)

DashVector

人工智能 向量检索 大模型 向量数据库

性能最快的内存数据存储:基础使用指南

测吧(北京)科技有限公司

测试

RPA的基本概念:全面解析RPA技术的工作原理和应用场景

八爪鱼采集器︱RPA机器人

RPA 自动化 RPAxAI

通过DashScope API调用将多种模态转换为向量

DashVector

人工智能 大模型 向量数据库

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