注意:在您询问代码本身的用法时,我强调了数据库的用法。在我提到的每一点上,答案仍然适用于两种情况。
在上一段中,您已经部分回答了自己的问题:查看应用程序运行时访问了什么。
您可能想对数据库进行概要分析,并要求概要分析器记录一天中的所有查询。它将为您提供最常用的数据库对象的概述,但不会告诉您从未使用过哪些数据库对象。同样,您仍然必须小心结果:例如,表可能仅通过存储过程使用,但是当您查看分析器中的查询时,看起来好像根本就没有使用该表。
查看源代码,搜索查询会更有用,并且在收集所有查询之后,您可以对数据库的使用情况有一个很好的了解,而不是频率(在探查器中很方便),而在使用/不使用方面使用的表。遗憾的是,对于编写不好/未维护多年的代码库,它可能非常困难且容易出错,尤其是在动态构造查询的情况下(想象一下一种方法,其中select
使用参数作为表名;您如何仅查看源代码就可以知道参数的可能值是什么?)。
静态分析和某些编译器也可能会显示错误的代码,但仍然无法为您提供所需的答案。
对数据本身或数据库元数据的分析可以揭示一些有趣的信息。例如,很容易断言,如果该表LogonAudit(uniqueidentifier LogonAuditId, datetime LogonEvent, ...)
包含2006年至2009年每天的10000条记录,并且从9月18 日起没有记录,则该表不再使用。起则不再使用该表。包含缩进为只读的数据的表。
这四个点将为您提供使用表的列表。剩下的要么不使用,要么不使用。您可以声明并测试它们,但是如果没有良好的单元测试覆盖率,这将不容易。任何“简单”的方法也会失败。例如,如果您有一个products_delme_not_used
表,则可以断言该表根本没有使用,并在代码中检查“ products_delme_not_used”。这是乐观的:在旧代码库中找到这样的DailyWTF候选对象并不罕见:
// Warning: WTF code below. Read with caution, never reuse it, and don't trust
// the comments.
private IEnumerable<Product> GetProducts()
{
// Get all the products.
return this.GetEntities<Product>("PRODUCT");
}
private IEnumerable<T> GetEntities<T>(string tableName)
{
// Everyone knows that SQL is case sensitive.
tableName = tableName.ToLower();
if (tableName == "user" || tableName == "product")
{
// Those tables were renamed recently in the database. Don't have time
// to refactor the code to change the names everywhere.
// TODO: refactor the code and remove this `if` block.
tableName += "s";
}
if (this.IsDelme(tableName))
{
// We have some tables which are marked for deletion but are still
// used, so we adjust their name.
tableName = this.Delme(tableName);
}
return this.DoSelectQuery<T>("select top 200 * from " + tableName);
}
private bool IsDelme(string name)
{
// Find if the table is among candidates for removal.
List<string> names = this.Query<string>("select Names from DelmeTables");
return names.Contains(name);
}
private string Delme(string name)
{
// Return the new name for a table renamed for deletion.
return string.Join("_", new [] { name, "delme", "not", "used" });
}
您能找出这段程式码实际使用了吗 products_delme_not_used
表吗?
如果我是你我会:
- 保留所有数据库对象,
- 重构整个应用程序(如果值得的话),
- 记录(重构时)应用程序,尤其是数据库使用情况。
当您完成最后两个步骤时,您可能会更好地了解数据库的用法,这将有助于确定不再使用的表的名称,并可能或多或少地安全地删除它们。