我想查找一种方法来获取在过去30天内在SQL Server数据库中执行的各种查询中使用的所有表名的列表。SQL查询中的表名列表
我有这些查询,想知道我们是否可以通过编程(而不是手动解析它)获取表名列表或从任何SQL Server系统表中获取详细信息。
我想查找一种方法来获取在过去30天内在SQL Server数据库中执行的各种查询中使用的所有表名的列表。SQL查询中的表名列表
我有这些查询,想知道我们是否可以通过编程(而不是手动解析它)获取表名列表或从任何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];
如果您想依赖您收集的查询,则不存在将查询映射到表的映射表。因此,不确定在哪里存储这些查询的方式,但是您可以尝试使用sys.dm_exec_cached_plans
和sys.dm_exec_sql_text
从计划XML中解析表或索引名称。这不是简单的,除非你有更多的内存超过你可能需要的,所以30天价值查询的所有计划目前都在计划缓存中是不太可能的。
是否有可能将此结果与在数据库中执行的实际查询绑定? –
这个结果只是抓住集合。例如,来自两个不同查询的索引扫描,每个都只计为1次扫描。所以不,没有办法将此与特定查询绑定。如果这真的是你想要做的,你将不得不解析。为什么不在加载特定的表时就让你的加载过程更新一些日志表,然后你不必去检查查询统计信息或其他DMV,当然也不需要分析查询文本。 –
加载过程将更新日志表,但我们正在找出在下一份工作中使用的60-70表。这项工作是直接查询和存储过程的组合,并且很难手动解析。有什么建议么? –
这听起来像是在解决某些问题的过程中的一个*步骤* - 您能否告诉我们这是什么问题? –
您如何知道您收集的查询是在过去30天内已执行的完整查询集? –
是的 - 这是解决一个问题的一个步骤。我们有一个加载过程,加载数据库中的所有表(大约300+),完成此过程后 - 我们运行一个使用大约60-70个表的作业。现在,不是等待整个加载过程完成,我们将检查这些60-70表并检查这些表中是否加载,然后我们将开始工作。希望这是明确的。 –