2016-08-05 77 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'子句),则只有匹配谓词的记录被记录在文件中。我不希望有明显的性能影响,但是必须执行一些操作(筛选所有查询)。 –