2013-10-09 84 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表。這項工作是直接查詢和存儲過程的組合,並且很難手動解析。有什麼建議麼? –