0

我们有一个包含大约 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 服务器似乎使用了大量资源来收集事件 - 经常,用户无法连接到数据库或因为超时而无法运行非常简单的查询。

是否有任何其他 - 资源密集型 - 收集数据库对象使用数据的方法?

4

2 回答 2

0

尝试这个

SELECT 
  [schema] = s.name, 
  [object] = o.name,
  o.type_desc
FROM sys.objects AS o
INNER JOIN sys.schemas AS s
  ON o.[schema_id] = s.[schema_id]
WHERE o.[type] IN ('P','U');
于 2017-09-22T19:29:51.277 回答
0

如果您正在查看表定义是否已更改,请使用

SELECT * FROM sys.tables order by modify_date desc

如果表中的任何数据被更新

SELECT OBJECT_NAME(OBJECT_ID) AS DatabaseName, last_user_update,*
FROM sys.dm_db_index_usage_stats
WHERE database_id = DB_ID( 'AdventureWorks')
AND OBJECT_ID=OBJECT_ID('test')

-- 查找未使用的存储过程

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

SELECT s.name, s.type_desc
FROM sys.procedures s
LEFT OUTER JOIN sys.dm_exec_procedure_stats d
        ON s.object_id = d.object_id
WHERE d.object_id IS NULL
ORDER BY s.name

如果 SQL Server 2016 则用于 UDF

SELECT * FROM sys.dm_exec_function_stats 
于 2017-09-22T18:11:10.950 回答