2016-08-05 12 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

これは、テーブルにアクセスしたすべてのプロシージャとクエリniceを記録します。これはまさに私が探していたものです、ありがとうございました。 –

+0

もしあなたができるのであれば、もう少し疑問があります。これを一般的に実施することによるパフォーマンスへの影響は何でしょうか?私は、d/bがすべてをログファイルに保存する必要があるため、ルーチンと手順が遅くなると想定していますか? –

+0

フィルタが正しく設定されている場合( 'ADD EVENT'の' WHERE'句)、述語に一致するレコードのみがファイルに記録されます。ただし、一部の操作(すべてのクエリをフィルタリング)を実行する必要がありますが、顕著なパフォーマンスの影響は期待できません。 –

関連する問題