我正在尝试寻找一种方法来获取过去 30 天内在 SQL Server 数据库中执行的各种查询中使用的所有表名的列表。
我有查询,想知道我们是否可以以编程方式(而不是手动解析)从中获取表名列表,或者可以从任何 SQL Server 系统表中获取详细信息。
我正在尝试寻找一种方法来获取过去 30 天内在 SQL Server 数据库中执行的各种查询中使用的所有表名的列表。
我有查询,想知道我们是否可以以编程方式(而不是手动解析)从中获取表名列表,或者可以从任何 SQL Server 系统表中获取详细信息。
假设服务器在过去 30 天内未重新启动,则可能是一种更准确的方法来确定已查询哪些表(如果您的查询集合不完整):
SET ANSI_WARNINGS OFF;
SET NOCOUNT ON;
GO
;WITH agg AS
(
SELECT
[object_id],
last_user_seek,
last_user_scan,
last_user_lookup,
last_user_update
FROM
sys.dm_db_index_usage_stats
WHERE
database_id = DB_ID()
)
SELECT
[Schema] = OBJECT_SCHEMA_NAME([object_id]),
[Table_Or_View] = OBJECT_NAME([object_id]),
last_read = MAX(last_read),
last_write = MAX(last_write)
FROM
(
SELECT [object_id], last_user_seek, NULL FROM agg
UNION ALL
SELECT [object_id], last_user_scan, NULL FROM agg
UNION ALL
SELECT [object_id], last_user_lookup, NULL FROM agg
UNION ALL
SELECT [object_id], NULL, last_user_update FROM agg
) AS x ([object_id], last_read, last_write)
GROUP BY
OBJECT_SCHEMA_NAME([object_id]),
OBJECT_NAME([object_id])
ORDER BY [Schema],[Table_Or_View];
如果您想依赖您收集的查询,则没有将查询映射到表的神奇系统表。因此,不确定您收集的这些查询的确切存储位置,但您可以尝试使用 and 将表或索引名称从计划 XML 中解析sys.dm_exec_cached_plans
出来sys.dm_exec_sql_text
。这并不简单,除非您拥有比您可能需要的更多的内存,否则 30 天查询的所有计划当前都在计划缓存中是极不可能的。