2013-10-09 123 views
0

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

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

+1

这听起来像是在解决某些问题的过程中的一个*步骤* - 您能否告诉我们这是什么问题? –

+0

您如何知道您收集的查询是在过去30天内已执行的完整查询集? –

+0

是的 - 这是解决一个问题的一个步骤。我们有一个加载过程,加载数据库中的所有表(大约300+),完成此过程后 - 我们运行一个使用大约60-70个表的作业。现在,不是等待整个加载过程完成,我们将检查这些60-70表并检查这些表中是否加载,然后我们将开始工作。希望这是明确的。 –

回答

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_planssys.dm_exec_sql_text从计划XML中解析表或索引名称。这不是简单的,除非你有更多的内存超过你可能需要的,所以30天价值查询的所有计划目前都在计划缓存中是不太可能的。

+0

是否有可能将此结果与在数据库中执行的实际查询绑定? –

+0

这个结果只是抓住集合。例如,来自两个不同查询的索引扫描,每个都只计为1次扫描。所以不,没有办法将此与特定查询绑定。如果这真的是你想要做的,你将不得不解析。为什么不在加载特定的表时就让你的加载过程更新一些日志表,然后你不必去检查查询统计信息或其他DMV,当然也不需要分析查询文本。 –

+0

加载过程将更新日志表,但我们正在找出在下一份工作中使用的60-70表。这项工作是直接查询和存储过程的组合,并且很难手动解析。有什么建议么? –