我不希望有代码的答案,而是一种策略。我不得不处理一个包含大量无用信息的数据库,这些信息甚至从未被访问过。我什至会猜测信噪比有利于噪声。我正在寻找一些统计/分析工具来帮助找出哪些表中的哪些列从未被访问过。
不幸的是,大多数时候它是不使用的列(而不是表)。所以我需要把它分解到这个级别。如果这很重要,我正在使用 SQL Server 2008。
我不希望有代码的答案,而是一种策略。我不得不处理一个包含大量无用信息的数据库,这些信息甚至从未被访问过。我什至会猜测信噪比有利于噪声。我正在寻找一些统计/分析工具来帮助找出哪些表中的哪些列从未被访问过。
不幸的是,大多数时候它是不使用的列(而不是表)。所以我需要把它分解到这个级别。如果这很重要,我正在使用 SQL Server 2008。
检查这一点的唯一方法是访问所有正在访问数据库的应用程序代码,并查看该代码在应用程序中的使用方式。如果您没有像 select * from table 这样的查询,那么您的工作会很轻松。
检查应用程序代码:没有什么比手动检查更准确的概述了,但这可能需要很长时间。如果您的数据库访问代码存储在一组类中,并且类与数据库表强耦合,那么您可以为每个数据库列“查找所有引用”。
触发器:在所有可疑表上设置插入、更新、删除触发器,然后将所有更新的列存储在单独的表中。这将为您提供最常用于更新的列的详细信息 - 因此其他列将成为删除的嫌疑人。
分析:为可疑表设置分析,运行一段时间并分析日志。
3rd 方工具:使用这些工具查找数据库中任何其他对象未引用的所有对象。可能有助于识别可疑表/列。尝试SQL 依赖跟踪器 或ApexSQL Clean
您可以使用audit
:
use master
GO
create server audit MyAudit
to file (filepath = 'C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA')
GO
alter server audit MyAudit
with (state = on);
GO
use [<YourDatabase]
GO
create database audit specification MyDatabaseAudit
for server audit MyAudit
add (
select on [<YouSchema>].[YourTable] by dbo
)
with (state = on)
GO
select [<YourColumn>] from [<YouSchema>].[YourTable]
GO
use master
GO
alter server audit MyAudit
with (state = off);
GO
select * from sys.fn_get_audit_file ('C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\MyAudit*',default,default);
GO
好的,所以这不会让您像列一样细化,但是因为它捕获每个 select 语句,您应该能够从它提供的数据中获取此信息。
显然,上面给出的文件路径仅用于示例目的。
另一种方法是SQL Profiler
跟踪,但是,这也不允许您到达列的级别,而只是捕获正在运行的选择语句。这样做的缺点是您需要正确过滤它以获得您想要的信息,这可能很麻烦。此外,可能会有更高的开销。
如果您很幸运并且所有数据都通过 SP 访问并且没有 *,那么您可以尝试使用 information_schema.columns 表。类似“选择不同”的东西
select p.[type]
,p.[name]
,c.[definition]
from sys.objects p
join sys.sql_modules c
on p.object_id = c.object_id
where p.[type] = ''P''
and c.[definition] like %'+COLUMN_NAME+'%' FROM INFORMATION_SCHEMA.COLUMNS
`
需要调整此查询以执行生成的 SQL 语句。