首页 > 数据库 >SQL Server中怎么知道哪些表被访问过?

SQL Server中怎么知道哪些表被访问过?

时间:2023-06-19 11:34:34浏览次数:45  
标签:dm exec text sql Server sys 访问 SQL sqltext


同事问了个问题,我需要知道SQL Server中的某个库都有哪些表被访问过,这个怎么实现?

SQL Server确实不太熟悉,如果是Oracle,我们可以通过AUDIT审计功能,实现表级、字段级这种粒度的监控,另外如果比较粗略的,还可以通过数据字典找到所有SELECT的语句,之所以说粗略,因为缓存是按照LRU算法存储的,如果数据库非常闲,他会记录很多执行过的语句,但如果数据库非常繁忙,很可能只存储了最近执行过的语句。

因此,相同的原理,我们能通过SQL Server的数据字典,找到一些执行过的语句,这就用到了sys.dm_exec_cached_plans和sys.dm_exec_sql_text,我们从微软的官方文档,可以了解视图的作用。

1. sys.dm_exec_cached_plans

SQL Server中怎么知道哪些表被访问过?_java

P.S. https://docs.microsoft.com/en-us/sql/relational-databases/system-dynamic-management-views/sys-dm-exec-cached-plans-transact-sql?view=sql-server-ver15

2. sys.dm_exec_sql_text

SQL Server中怎么知道哪些表被访问过?_python_02

P.S. https://docs.microsoft.com/en-us/sql/relational-databases/system-dynamic-management-views/sys-dm-exec-sql-text-transact-sql?view=sql-server-ver15

sys.dm_exec_cached_plans存储的是查询计划,作用和Oracle的执行计划应该是相同的,通过复用,减少解析消耗,提高数据检索执行的效率。通过该视图的plan_handle,可以关联sys.dm_exec_sql_text,找到执行的SQL语句文本,再结合我需要找检索的SELECT关键字,就可以达到找出执行过的SELECT语句,进而知道那些表被访问了。

SQL如下,

SELECT p.refcounts, p.usecounts, sqltext.text
  FROM sys.dm_exec_cached_plans p
 CROSS APPLY sys.dm_exec_sql_text(p.plan_handle) sqltext
 WHERE p.objtype IN ('Adhoc', 'Prepared') 
   AND p.cacheobjtype = 'Compiled Plan'
   AND sqltext.text NOT LIKE '%sys%'
   AND sqltext.text NOT LIKE '%fn_listextendedproperty%'
   AND upper(sqltext.text) LIKE 'SELECT%'
   AND upper(db_name(sqltext.dbid)) = @
 ORDER BY p.usecounts desc, p.refcounts desc;

相关的字段含义如下所示,

SQL Server中怎么知道哪些表被访问过?_java_03

SQL Server中怎么知道哪些表被访问过?_python_04

SQL Server中怎么知道哪些表被访问过?_sql_05

如果有朋友知道其他更好实现这个需求的方案,可以私信,共享一下。


标签:dm,exec,text,sql,Server,sys,访问,SQL,sqltext
From: https://blog.51cto.com/u_13950417/6512025

相关文章

  • android连接本地数据库sqlite,实现增删改查
    前言Android应用数据存储简单来说有这么几种:文件存储、SharedPreference存储、SQLite数据库存储、网络服务器存储、ContentProvider等。如果需要存储的数据量大的时候,那么使用文件存储会有很大的弊端,例如:你想修改其中很微小的项就要先读取整个文件的内容,修改后再全部保存,非常耗时。......
  • MySQL中SQL语句的执行顺序(详细)
    一:SQL语句的执行顺序作为一个开发人员,在开发中基本上每时每刻都要和数据库打交到;虽然写过无数的SQL语句,但是写好一个SQL可不是这么简单的,它涉及到各式各样的优化和书写方式;但下面我以MySQL中的SQL执行顺序来作为讲解,对其进行剖析。1:SQL数据的准备为了可以为下文做铺垫,......
  • 视图的使用及sql语句阅读
    视图的使用及sql语句阅读1、视图1.1概念 视图是由数据库中的一个表或多个表导出的虚拟表,其作用是方便用户对数据的操作。与包含数据的表不一样,视图只包含使用时动态检索数据的查询。1.2常见应用重用SQL语句简化复杂的SQL操作。在编写查询后,可以方便地重用它而不必知道其基本查询......
  • 介绍一个MySQL参数检索工具
    碰巧看到徐老师的这篇文章《MySQL的参数工具》,其中介绍了一个讲解MySQL不同版本参数的小工具,网站的作者是MySQL日本用户组的负责人Tomita。该网站能够提供不同版本MySQL的参数,包括不同版本之间的对比。当用户需要对MySQL进行升级、需要确认不同版本间的具体参数差异时,就可以用到这......
  • MySQL数据字典提示1146不存在的问题解决
    最近某套MySQL因为磁盘挂载问题,异常宕机,拉起后,数据库能正常访问了,但是在error.log一直提示这个错误,[ERROR]InnoDB:Table`mysql`.`innodb_table_stats`notfound.2021-09-03T08:26:52.446564Z2[ERROR]InnoDB:Fetchofpersistentstatisticsrequestedfortable`jira`.`c......
  • JSQLParser碰到的问题
    JSQLParser是github上一个开源的项目,专门解析SQL,可以轻松地得到一条SQL的列、表、条件等对象,P.S. https://github.com/JSQLParser/JSqlParser最近在做一个功能开发的时候,被他困扰了下,从需求来讲,就是利用正则,先将多行的SQL改成一行,然后通过JSQLParser解析SQL,但是在这过程中,碰到了很......
  • 小白学习MySQL - 随机插入测试数据的工具
    我们日常做一些MySQL测试的时候,经常要造数据,通常就写个循环插入数据的存储过程。前两天碰巧看文章说,mysql_random_data_load程序能向MySQL随机插入大量数据,于是了解一下。mysql_random_data_load是个开源的项目,github路径如下,https://github.com/Percona-Lab/mysql_random_data_loa......
  • mysql
    创建库createdatabasedb1查看库showdatabase切换当前库usedb1删除库dropdatabasedb1 创建表createtablestudents清空表deletefrom表名增语法:insertinto表名(列1,列2...)values(值,值...)Eg:insertintostudents(name,sex,age)values(‘zm’,’male’,1......
  • mysql 存储过程实例
    mysql存储过程实例1. 存储过程-递归查询数据字典树数据CREATEDEFINER=`lihongyuan`@`%`PROCEDURE`GetDataDictionaryTree`(intkeyvarchar(200))BEGINWITHRECURSIVEcteAS(SELECTid,name,ParentId,`Order`FROMlbd_app......
  • Android - 无法使用任何临时 SqlClient 版本(v2.1.4、v4.1.0、v5Preview)连接到 SQL Ser
    Aconnectionwassuccessfullyestablishedwiththeserver,butthenanerroroccurredduringthepre-loginhandshake.设法用证书和IP地址解决它。使用powershell为您的IP地址创建证书:New-SelfSignedCertificate-certstorelocationcert:\localmachine\my-dns......