2016-08-05 79 views
3

我們有一個SQL Server數據庫,其中有一個由代號組成的表。類似於在SQL Server的表中查找大多數查詢項目

Ticker | description 
-------+------------- 
USDHY | High yield 
USDIG | Investment grade ... 

現在我們有很多其他表具有與這些代價(時間系列)相對應的數據。我們希望能夠創建一份報告,告訴我們哪些代碼更受質疑,哪些代碼不是查詢的。這可以讓我們選擇性地運行一些更頻繁使用的代號的程序,並定期忽略其他程序。

是否有某種方式可以在SQL中實現這一點,任何能夠在一段時間內生成此統計量的報告稱爲n個月。

任何幫助非常感謝

+0

您可以創建一個觸發器,以便在訪問記錄時將其記錄到另一個表中。然後,您可以將此報表從其他表中移除。但是,請記住,會有一些性能開銷,因爲每次查詢數據時觸發器都必須執行。 –

+1

觸發器用於選擇?我會建議SQL Server審計或擴展事件。這個記錄是從應用程序訪問的嗎那將是另一種選擇。 –

+1

我絕對會使用應用程序將查詢記錄到日誌表中。如果你不能使用該應用程序,我想你可以使用第三方事務日誌閱讀器進行研究,但如果是我,我會告訴我的老闆這個邏輯的位置在應用程序中。 ......其實我不必告訴他,因爲他已經知道了。 :) –

回答

2

似乎目前爲止沒有答案。正如我所說,一個可能性是使用擴展事件象下面這樣:

CREATE EVENT SESSION [TestTableSelectLog] 
ON SERVER 
ADD EVENT sqlserver.sp_statement_completed (
WHERE [statement] LIKE '%SELECT%TestTable%' --Capure all selects from TestTable 
    AND [statement] NOT LIKE '%XEStore%' --filter extended event queries 
    AND [statement] NOT LIKE '%fn_xe_file_target_read_file%'), 
ADD EVENT sqlserver.sql_statement_completed (
WHERE [statement] LIKE '%SELECT%TestTable%' 
    AND [statement] NOT LIKE '%XEStore%' 
    AND [statement] NOT LIKE '%fn_xe_file_target_read_file%') 
ADD TARGET package0.event_file (SET FILENAME=N'C:\Temp\TestTableSelectLog.xel');--log to file 

ALTER EVENT SESSION [TestTableSelectLog] ON SERVER STATE=START;--start capture 

您可以從文件中使用sys.fn_xe_file_target_read_file然後選擇:

CREATE TABLE TestTable 
(
    Ticker varchar(10), 
    [Description] nvarchar(100) 
) 

SELECT * FROM TestTable 

SELECT *, CAST(event_data AS XML) AS 'event_data_XML' 
FROM sys.fn_xe_file_target_read_file('C:\Temp\TestTableSelectLog*.xel', NULL, NULL, NULL) 

SELECT聲明應被捕獲。

擴展事件也可以從GUI(Management Studio中的Management/Extended Events/Sessions)進行配置。

+0

這將記錄所有已訪問表的過程和查詢,太棒了!這正是我所期待的,非常感謝你。 –

+0

如果可以的話,還有幾個問題:總體來說,這會對性能產生什麼影響?我假設一些例行程序和查詢會比較慢,因爲d/b需要將所有內容保存在日誌文件中? –

+0

如果filter設置正確('ADD EVENT'中的'WHERE'子句),則只有匹配謂詞的記錄被記錄在文件中。我不希望有明顯的性能影響,但是必須執行一些操作(篩選所有查詢)。 –