找出表中的哪些列永远不会被使用

时间:2013-03-06 06:35:56

标签: sql-server tsql

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

不幸的是,大部分时间它都是未使用的列(而不是表)。所以我需要把它分解到这个水平。我正在使用SQL Server 2008,如果这很重要的话。

3 个答案:

答案 0 :(得分:1)

检查此问题的唯一方法是访问正在访问数据库的所有应用程序代码,并查看该代码在应用程序中的使用方式。如果您没有像表格中的select *那样的查询,那么您将有一个轻松的工作。

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

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

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

第三方工具:使用这些工具查找数据库中任何其他对象未引用的所有对象。可能有助于识别可疑表格/列。试试SQL Dependancy trackerApexSQL Clean

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

答案 2 :(得分: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语句。