SQL Server 视图的更新排查及清除缓存

目录

前言

获取数据的时候,发现数据少了两个字段值,归根原因是Java中的实体类少写了两个,后续补充上就好了!

但也正了解到视图中的刷新原理以及排查机制,如果确认是视图等引起,可结合如下文章学习

原先也写过类似的知识点:

  1. Sql Server缓冲池、连接池等基本知识(附Demo)
  2. SQL Server索引碎片的基本知识(附Demo)

排查方向

在 SQL Server 中,视图不会自动更新其结构

如果表中添加了新字段,但没有刷新视图,查询视图时仍然返回旧结构的数据

一共有两种解决方案:

sql 复制代码
EXEC sp_refreshview '视图名字';

截图如下:

或者重新创建视图:

sql 复制代码
DROP VIEW 视图;
CREATE VIEW dbo.vw_SSBoxCheck AS 
SELECT ...

第二个排查方向是用户权限的问题!

确保用户可以查询得到

sql 复制代码
GRANT SELECT ON 视图 TO your_user;

第三个排查方向是视图的缓存问题:

SQL Server 可能存在缓存问题,导致查询的仍然是旧视图结构

sql 复制代码
DBCC FREEPROCCACHE;
DBCC DROPCLEANBUFFERS;
  • SQL Server 在执行查询时,会先生成 查询执行计划 并缓存起来,以加快后续相同 SQL 语句的执行速度。

    DBCC FREEPROCCACHE 命令用于清除 SQL Server 的 执行计划缓存,让 SQL Server 重新解析 SQL 语句并生成新的执行计划

  • SQL Server 数据缓存(Buffer Pool) 存储了最近访问的数据页,以减少磁盘 I/O 操作,提高查询速度。

    DBCC DROPCLEANBUFFERS 命令用于清空 SQL Server 缓冲池中的 干净数据页(未修改的页),让查询重新从磁盘读取数据

总的来说

  • EXEC sp_refreshview ------ 刷新视图
  • DBCC FREEPROCCACHE ------ 清空执行计划缓存
  • DBCC DROPCLEANBUFFERS ------ 清空数据缓存
命令 作用 适用场景 影响 备注
sp_refreshview 刷新视图的元数据 视图结构变更后查询异常 仅影响视图 只影响视图定义,不影响数据或缓存
DBCC FREEPROCCACHE 清空查询执行计划缓存 结构变更、索引优化、查询优化 影响 SQL 解析性能,导致查询重新编译 仅清除执行计划,不影响数据缓存
DBCC DROPCLEANBUFFERS 清空数据缓存 进行数据库性能测试或数据更新异常 影响查询性能,需要重新加载数据 仅清理未修改的缓冲页,不影响脏页
相关推荐
Wang's Blog2 小时前
Java框架快速入门: Spring Security+OAuth2之多因子认证缓存服务
java·spring·缓存
雪芽蓝域zzs2 小时前
第三十六节:keep-alive 页面缓存(Vue3 + 后台管理系统)
前端·vue.js·缓存
我是苏苏2 小时前
Redis开发09:Windows系统下主从复制的配置教程
数据库·redis·缓存
mengzhi啊13 小时前
缓存类CacheDataManager把临时数据存入json。做成插件·
qt·缓存·json
小lu飞16 小时前
DeepSeek Flash 降价的技术账本:缓存友好型定价如何改写推理成本结构
缓存
hweiyu0018 小时前
Redis命令:APPEND
redis·缓存
敲代码的嘎仔18 小时前
从集群锁失效到异步领券:我用分布式锁 + Redisson + MQ 把领券接口 RT 从 200ms 压到 15ms
java·数据库·redis·分布式·缓存·ai·wpf
MetaLite1 天前
Spring Cache只留注解-MetaLite如何二开缓存运行时
java·spring·缓存
wdfk_prog1 天前
lely-canopen-rtt:为什么推荐在 RT-Thread 上使用 Lely CANopen 构建主站
java·运维·缓存·docker·容器
莫得感情 o1 天前
Redis 12 · 缓存一致性:数据库与缓存双写怎么不乱
redis·缓存