Я использую SQL Server 2012
У меня есть длительное расширенное событие (выполняется в течение нескольких дней для захвата событий), которое сохраняется в файл .xel.
У меня есть задание, которое периодически запускается для импорта данных в промежуточную таблицу.
Я импортирую только столбец XML event_data
из файла, чтобы я мог разобрать нужные мне поля XML и сохранить их в таблице для отчетов.
Я знаю, когда в последний раз я запускал импорт, поэтому я хочу посмотреть, могу ли я выбрать только те записи из файла, которые были добавлены с момента последнего запуска процесса импорта.
Сейчас он работает, но он импортирует ВСЕ записи из файлов в промежуточные таблицы, анализирует нужные мне поля (включая метку времени), затем импортирует только те записи, которые имеют метку времени с момента последнего выполнения задания.
Мой процесс вставляет только новые с момента последнего запуска задания, так что все работает нормально, но выполняет большую часть работы, импортируя и анализируя XML для ВСЕХ записей в файле, включая те, которые я уже импортировал в прошлый раз работа закончилась.
Поэтому я хочу найти способ вообще не импортировать из файла, если он уже был импортирован, или, по крайней мере, не нужно анализировать XML для записей, которые уже были импортированы (хотя я должен проанализировать его сейчас, чтобы получить отметка времени для исключения уже обработанных).
Ниже приведено то, что у меня есть, и, как я уже сказал, оно работает, но выполняет много дополнительной работы, если я могу найти способ пропустить уже импортированные.
Я включил в свой процесс только те шаги, по которым мне нужна помощь:
-- pull data from file path and insert into staging table
INSERT INTO #CaptureObjectUsageFileData (event_data)
SELECT cast(event_data as XML) as event_data
FROM sys.fn_xe_file_target_read_file(@FilePathNameToImport, null, null, null)
-- parse out the data needed (only columns using) and insert into temp table for parsed data
INSERT INTO #CaptureObjectUsageEventData (EventTime, EventObjectType, EventObjectName)
SELECT n.value('(@timestamp)[1]', 'datetime') AS [utc_timestamp],
n.value('(data[@name="object_type"]/text)[1]', 'varchar(500)') AS ObjectType,
n.value('(data[@name="object_name"]/value)[1]', 'varchar(500)') as ObjectName
from (
SELECT event_data
FROM #CaptureObjectUsageFileData (NOLOCK)
) ed
CROSS apply ed.event_data.nodes('event') as q(n)
-- select from temp table as another step for speed/conversion
-- converting the timestamp to smalldatetime so it doesnt get miliseconds so when we select distinct it wont have lots of dupes
INSERT INTO DBALocal.dbo.DBObjectUsageTracking(DatabaseID, ObjectType, ObjectName, ObjectUsageDateTime)
SELECT DISTINCT @DBID, EventObjectType, EventObjectName, CAST(EventTime AS SMALLDATETIME)
FROM #CaptureObjectUsageEventData
WHERE EventTime > @LastRunDateTime