我想查找一種方法來獲取在過去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表並檢查這些表中是否加載,然後我們將開始工作。希望這是明確的。 –