我正在尝试寻找一种方法来获取在过去30天内在SQL Server数据库中执行的各种查询中使用的所有表名的列表。
我有查询并想知道我们是否可以通过编程方式(而不是手动解析它)从中获取表名列表,或者可以从任何SQL Server系统表中获取详细信息。
答案 0 :(得分:1)
假设服务器在过去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];
如果您想依赖于您收集的查询,则没有将查询映射到表的魔术系统表。因此,不确定您收集的这些查询的确切位置,但您可以尝试使用sys.dm_exec_cached_plans
和sys.dm_exec_sql_text
从计划XML中解析表或索引名称。这并不简单,除非你的内存超出了你可能需要的内存,否则30天的查询计划目前都不在计划缓存中。