我们有一个包含大约 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 文件的大小将增长到大约 300 GB - 每天!)。此外,SQL 服务器似乎使用了大量资源来收集事件 - 经常,用户无法连接到数据库或因为超时而无法运行非常简单的查询。
是否有任何其他 - 资源密集型 - 收集数据库对象使用数据的方法?