我不希望得到代码的答案,而是一种策略。我不得不处理一个包含大量无用信息的数据库,这些信息甚至从未被访问过。我甚至会猜测信噪比有利于噪音。我正在寻找一些统计/分析工具来帮助找出从未访问过的表中的哪些列。
不幸的是,大部分时间它都是未使用的列(而不是表)。所以我需要把它分解到这个水平。我正在使用SQL Server 2008,如果这很重要的话。
答案 0 :(得分:1)
检查此问题的唯一方法是访问正在访问数据库的所有应用程序代码,并查看该代码在应用程序中的使用方式。如果您没有像表格中的select *那样的查询,那么您将有一个轻松的工作。
检查应用程序代码:没有什么能比手动检查更精确地概述,但这可能需要很长时间。如果您的数据库访问代码存储在一组类中,并且类与数据库表紧密耦合,那么您可以只为每个数据库列“查找所有引用”。
触发器:在所有可疑表上设置插入,更新,删除触发器,然后将所有更新的列存储在单独的表中。这将为您提供有关最常用于更新的列的详细信息 - 因此其他列将成为删除的嫌疑人。
分析:设置可疑表的分析,运行一段时间并分析日志。
第三方工具:使用这些工具查找数据库中任何其他对象未引用的所有对象。可能有助于识别可疑表格/列。试试SQL Dependancy tracker或ApexSQL 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语句。