0

我正在尝试寻找一种方法来获取过去 30 天内在 SQL Server 数据库中执行的各种查询中使用的所有表名的列表。

我有查询,想知道我们是否可以以编程方式(而不是手动解析)从中获取表名列表,或者可以从任何 SQL Server 系统表中获取详细信息。

4

1 回答 1

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];

如果您想依赖您收集的查询,则没有将查询映射到表的神奇系统表。因此,不确定您收集的这些查询的确切存储位置,但您可以尝试使用 and 将表或索引名称从计划 XML 中解析sys.dm_exec_cached_plans出来sys.dm_exec_sql_text。这并不简单,除非您拥有比您可能需要的更多的内存,否则 30 天查询的所有计划当前都在计划缓存中是极不可能的。

于 2013-10-09T17:04:09.443 回答