約 5000 個のオブジェクト (テーブル、ビュー、SQL 関数、ストアド プロシージャなど) を含む大規模なデータベースがあります。これらのオブジェクトの大部分はもう使用されていませんが、どれがどれであるかを正確に知る人はいません。そのため、誰かがまだそれらを使用しているかどうかを知らずに、古いオブジェクトを維持し続けています。
拡張イベントを使用して、実際に使用されているオブジェクトを追跡したいと考えました。基本的に、次のクエリを使用して、データベース オブジェクトがアクセスされるたびにイベントを収集します。イベントは *.xel ファイルに保存されます。
CREATE EVENT SESSION {mySession} ON SERVER
ADD EVENT sqlserver.lock_acquired (
SET collect_database_name = (0)
,collect_resource_description = (1)
ACTION(sqlserver.client_hostname, sqlserver.client_app_name, collect_system_time, database_id)
WHERE (
[package0].[equal_boolean]([sqlserver].[is_system], (0)) -- user SPID
AND [package0].[equal_uint64]([resource_type], (5)) -- OBJECT
AND [package0].[equal_uint64]([database_id], {dbId}) -- user database
AND [package0].[greater_than_equal_int64]([object_id], ({minimalUserObjectId})) -- user object
AND ([mode] = (1)-- SCH - S
OR [mode] = (6)-- IS
OR [mode] = (8)-- IX
OR [mode] = (3)-- S
OR [mode] = (5)-- X
)
)
)
ADD TARGET [package0].event_file
(
SET filename='{xelFile}',
max_file_size=25,
max_rollover_files=5000
)
WITH (
MAX_MEMORY = 25 MB
,EVENT_RETENTION_MODE = ALLOW_SINGLE_EVENT_LOSS
,MAX_DISPATCH_LATENCY = {MaxDispatchLatency} SECONDS
,MEMORY_PARTITION_MODE = PER_NODE
,TRACK_CAUSALITY = OFF
,STARTUP_STATE = OFF
);
次に、これらの *.xel ファイルを定期的に読み取り、値を集計して *.xlsx ファイルに保存する別のプログラムを作成しました。
これは主に機能します。ただし、実稼働データベースでは、膨大な量のデータが収集されます (*.xel ファイルのサイズは 1 日あたり約 300 GB まで増加します)。また、SQL サーバーはイベントを収集するために多くのリソースを使い果たしているようです。ユーザーがデータベースに接続できなかったり、タイムアウトが発生したために非常に単純なクエリを実行できなかったりすることがよくあります。
db オブジェクトの使用状況データを収集するための、リソースをあまり消費しない他の方法はありますか?