注:コードの使用法について質問されている間、データベースの使用法にアクセントを付けました。答えは、私が言及したすべての点で両方の場合に適用されます。
あなたはすでに最後の段落であなた自身の質問に部分的に答えました:アプリケーションの実行中にアクセスされるものを見てください。
データベースのプロファイルを作成し、プロファイラーに1日間のすべてのクエリを記録するように依頼できます。最も使用されているデータベースオブジェクトの概要は表示されますが、どのオブジェクトが使用されていないかはわかりません。また、結果に注意する必要があります。たとえば、テーブルはストアドプロシージャでのみ使用できますが、プロファイラからのクエリを見ると、テーブルがまったく使用されていないように見えます。
ソースコードを確認し、クエリを検索する方が便利です。すべてのクエリを収集した後は、頻度(プロファイラが便利)ではなく、使用/非使用の観点からデータベースの使用状況を十分に理解できます。使用済みテーブル。悲しいことに、長年のコードベースで不適切に書かれている/維持されていないため、特にクエリが動的に構築される場合、非常に困難でエラーが発生しやすくなる可能性があります(select
テーブルの名前としてパラメータを使用するメソッドを想像してください。おそらくソースコードを見ることで、パラメーターの可能な値が何かを知っていますか?)。
静的解析と一部のコンパイラはデッドコードを明らかにすることもありますが、それでも必要な答えが得られません。
データ自体またはデータベースメタデータの分析により、興味深い情報が明らかになる場合があります。たとえば、テーブルがあることは容易主張することになりLogonAudit(uniqueidentifier LogonAuditId, datetime LogonEvent, ...)
、それは10の000年の2009年から2006年のための一日あたりのレコード、9月からレコードなし、18含まれている場合は、もはや使用されていない目を、2009年と同じではAの真実ではありませんほとんど読み取り専用になるようにインデントされたデータを含むテーブル。
これらの4つのポイントを合わせると、使用済みテーブルのリストが表示されます。残りのものは使用されるかされません。アサーションを作成してテストすることもできますが、適切な単体テストのカバレッジがなければ、簡単ではありません。「簡単な」方法も失敗します。たとえば、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
テーブルを使用していることがわかりますか?
もし私があなただったら、私は:
- すべてのデータベースオブジェクトを所定の場所に保持し、
- アプリケーション全体をリファクタリングします(価値がある場合)。
- (リファクタリング中に)アプリケーション、特にデータベースの使用状況を文書化します。
最後の2つの手順を完了すると、おそらくデータベースの使用法をよりよく理解できるようになります。これは、使用されなくなったテーブルの名前を把握するのに役立ち、多かれ少なかれ安全に削除できます。