SQL Server 2019中识别未使用视图需结合三步:1. 用sys.dm_sql_referencing_entities查零引用视图;2. 通过sys.query_store_query确认近7天无执行记录;3. 手动排除命名含_tmp、_bak等的遗留视图,并人工核验跨系统调用。

SQL Server 2019 中没有内置的“是否被使用”标记,sys.views 本身不记录调用频次或最后访问时间,直接查“谁没被用过”必须靠间接推断——最可靠的方式是检查依赖关系和查询历史。
用 sys.dm_sql_referencing_entities 找零引用视图
这是最常用、也最接近“无用”定义的方法:找出没有任何其他对象(存储过程、函数、其他视图)显式引用的视图。
-
sys.dm_sql_referencing_entities返回的是“谁在引用我”,所以对每个视图执行一次,看结果集是否为空 - 注意:它只识别静态 SQL 中的硬编码引用(比如
SELECT * FROM dbo.vw_old_report),不捕获拼接 SQL、ORM 动态生成的语句或应用层直接调用 - 示例脚本(仅返回疑似废弃的视图名):
SELECT v.name AS view_name
FROM sys.views v
WHERE NOT EXISTS (
SELECT 1
FROM sys.dm_sql_referencing_entities(
CONCAT(SCHEMA_NAME(v.schema_id), '.', v.name),
'OBJECT'
) r
)⚠️ 风险点:如果某视图只被应用代码或作业中的 Ad-hoc 查询调用(没被其他数据库对象引用),它也会被误判为“无用”。务必结合下一步验证。
查 sys.query_store_query 确认最近是否真没人查
启用查询存储(QUERY_STORE = ON)后,SQL Server 会记录实际执行过的查询文本和频率。这是判断“是否还在用”的黄金依据。
- 先确认查询存储已开启:
SELECT actual_state_desc FROM sys.database_query_store_options,返回READ_WRITE才有效 - 运行以下语句,查过去 7 天内未出现在查询存储中的视图(需替换
@days):
DECLARE @days INT = 7;
SELECT v.name AS view_name
FROM sys.views v
WHERE NOT EXISTS (
SELECT 1
FROM sys.query_store_query q
JOIN sys.query_store_query_text qt ON q.query_text_id = qt.query_text_id
WHERE qt.query_sql_text LIKE '%' + v.name + '%'
AND q.last_execution_time > DATEADD(day, -@days, GETDATE())
);⚠️ 注意:模糊匹配 LIKE 可能误伤(如视图名 vw_user 被 vw_user_log 冲突),生产环境建议用正则替代或加 schema 限定;另外,查询存储默认只保留 15–30 天数据,时间窗口别设太长。
手动排除系统/模板/测试类视图
很多“无引用+无查询记录”的视图其实是开发遗留物,比如带 _tmp、_bak、test_、old_ 后缀,或创建时间远早于当前项目上线日。
- 加一层过滤可大幅降低误删风险:
AND v.create_dateAND v.name NOT LIKE 'vw[_]test%'AND v.name NOT LIKE '%_bak%'
这类命名惯例比依赖分析更直观,也更容易跟团队对齐清理范围。
真正难判断的不是“能不能删”,而是“删了会不会影响某个凌晨跑的报表作业、某个离线 BI 工具或某个没进源控的 Excel 连接字符串”——依赖分析和查询历史只能覆盖数据库内行为,跨系统调用永远需要人工兜底核验。

















