2016-08-05 2 views
3

У нас есть база данных SQL Server, в которой есть таблица, состоящая из тикеров. Что-то вродеПоиск наиболее запрашиваемых элементов в таблице в SQL Server

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

Теперь у нас есть много других таблиц, у которых есть данные, соответствующие этим тикерам (временным рядам). Мы хотим создать отчет, который может показать нам, какой из этих тикеров больше запрашивается и которые вообще не запрашиваются. Это может позволить нам выборочно выполнять некоторые процедуры для тикеров, которые чаще используются и регулярно игнорируют другие.

Есть ли способ достичь этого в SQL, любой отчет, который мог бы сгенерировать этот стат в течение определенного периода времени, говорит n-месяцы.

Любая помощь очень ценится

+0

Вы можете создать триггер, который регистрирует его в другой таблице при доступе к записи. Затем вы можете запустить отчет из этой другой таблицы. Однако имейте в виду, что накладные расходы будут превышены, поскольку триггер должен будет выполняться каждый раз, когда запрашиваются данные. –

+1

Триггер для выбора? Я бы посоветовал SQL Server Audit или Extended Events. Доступны ли записи из приложения? Это был бы другой вариант. –

+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 заявление должно быть захвачена.

Расширенные события могут быть также настроены из графического интерфейса (управление/расширенные события/сеансы в Studio Management).

+0

Это протоколирует все процедуры и запросы, которые имеют доступ к таблице, приятно! Это именно то, что я искал, большое вам спасибо. –

+0

Еще пару вопросов, если бы вы могли: какое влияние будет иметь влияние на это в целом? Я предполагаю, что некоторые рутинные процедуры и запросы будут медленнее, потому что d/b должен сохранять все в файле журнала? –

+0

Если фильтр установлен правильно (предложение WHERE) в 'ADD EVENT'), записывается только файл, соответствующий соответствующему предикату. Я бы не ожидал заметного влияния на производительность, однако некоторые операции (фильтрация всех запросов) должны выполняться. –

Смежные вопросы