2

我不希望有代码的答案,而是一种策略。我不得不处理一个包含大量无用信息的数据库,这些信息甚至从未被访问过。我什至会猜测信噪比有利于噪声。我正在寻找一些统计/分析工具来帮助找出哪些表中的哪些列从未被访问过。

不幸的是,大多数时候它是不使用的列(而不是表)。所以我需要把它分解到这个级别。如果这很重要,我正在使用 SQL Server 2008。

4

3 回答 3

1

检查这一点的唯一方法是访问所有正在访问数据库的应用程序代码,并查看该代码在应用程序中的使用方式。如果您没有像 select * from table 这样的查询,那么您的工作会很轻松。

检查应用程序代码:没有什么比手动检查更准确的概述了,但这可能需要很长时间。如果您的数据库访问代码存储在一组类中,并且类与数据库表强耦合,那么您可以为每个数据库列“查找所有引用”。

触发器:在所有可疑表上设置插入、更新、删除触发器,然后将所有更新的列存储在单独的表中。这将为您提供最常用于更新的列的详细信息 - 因此其他列将成为删除的嫌疑人。

分析:为可疑表设置分析,运行一段时间并分析日志。

3rd 方工具:使用这些工具查找数据库中任何其他对象未引用的所有对象。可能有助于识别可疑表/列。尝试SQL 依赖跟踪器ApexSQL Clean

于 2013-03-12T13:52:39.060 回答
0

您可以使用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跟踪,但是,这也不允许您到达列的级别,而只是捕获正在运行的选择语句。这样做的缺点是您需要正确过滤它以获得您想要的信息,这可能很麻烦。此外,可能会有更高的开销。

于 2013-03-06T09:05:25.463 回答
0

如果您很幸运并且所有数据都通过 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 语句。

于 2020-02-05T16:56:27.930 回答