SE の雑記

SQL Server の情報をメインに Microsoft 製品の勉強内容を日々投稿

SQL Database の監査ログの確認に sys.fn_get_audit_file_v2 を使用すると検索効率は向上するのか?

leave a comment

結論から書いておくと、現時点では sys.fn_get_audit_filesys.fn_get_audit_file_v2 のどちらを使用しても検索効率は大きく向上しないという雰囲気があります。

検索効率が向上しないと考えた理由

sys.fn_get_audit_file_v2 では、関数の呼び出し時に開始と終了の event_time (UTC) を指定することができるようになりました。

これにより、関数単体で検索を行う時間範囲を指定することができます。

実行時の実行プランが以下となります。

image

v2 で実行しても、最初に fn_get_audit_file が呼び出され、その結果に対してフィルターが行われてます。フィルターの内容は以下になるのですが、関数に指定した時間範囲で、event_time を検索するものとなります。

image

それでは、従来の sys.fn_get_audit_file で event_time を WHERE 句に指定した場合、実行プランはどうなるでしょうか?

この場合も、実行プランは同一となります。

image

つまり、以下のクエリは等価となります。

-- v1
SELECT TOP 100 * 
FROM sys.fn_get_audit_file(
'https://xxxx.blob.core.windows.net/sqldbauditlogs/xxx/xxx/SqlDbAuditing_ServerAudit/2024-10-13/'
, DEFAULT, DEFAULT
)
WHERE  event_time >='2024-10-13T00:39:00Z' AND event_time <  '2024-10-13T00:45:00Z'

-- v2
SELECT TOP 100 * 
FROM sys.fn_get_audit_file_v2(
'https://xxxx.blob.core.windows.net/sqldbauditlogs/xxx/xxx/SqlDbAuditing_ServerAudit/2024-10-13/'
, DEFAULT, DEFAULT
, '2024-10-13T00:39:00Z'
, '2024-10-13T00:45:00Z'
)

現状、sys.fn_get_audit_file については、次のようなクエリとなっており、内部では v2 が日付指定なしで呼ばれていますので、実行プランが変化しないのは想定される動作だと思いますが。

CREATE FUNCTION sys.fn_get_audit_file (
	@file_pattern nvarchar(260),
	@initial_file_name nvarchar(260) = NULL,
	@audit_record_offset bigint = NULL)
RETURNS table
AS
RETURN
(
	SELECT *
	FROM sys.fn_get_audit_file_v2(
		@file_pattern,
		@initial_file_name,
		@audit_record_offset,
		default,
		default)
)

v2 を使用した場合、日付範囲の指定が必須 (省略する場合は明示的に DEFAULT を指定する) となり、WHERE 句を記載することは不要となるため、記述の容易性や可読性は向上しますが、性能面では従来の方法を WHERE 句で event_time を指定する方法と大きな差はでないかもしれませんね。

Share

Written by Masayuki.Ozawa

10月 16th, 2024 at 9:25 am

Posted in SQL Database

Tagged with

Leave a Reply