참고 : 코드 사용에 대해 묻는 동안 데이터베이스 사용에 악센트를 두었습니다. 대답은 내가 언급 한 모든 시점에서 여전히 두 경우 모두에 적용됩니다.
마지막 단락에서 이미 자신의 질문에 부분적으로 답변했습니다. 응용 프로그램이 실행되는 동안 액세스되는 항목을보십시오.
데이터베이스 를 프로파일 링하고 프로파일 러에게 하루 동안의 모든 쿼리를 기록하도록 요청할 수 있습니다. 가장 많이 사용되는 데이터베이스 개체에 대한 개요를 제공하지만 사용되지 않은 데이터베이스 개체는 알 수 없습니다. 또한 결과에주의를 기울여야합니다. 예를 들어 테이블은 저장 프로 시저를 통해 독점적으로 사용될 수 있지만 프로파일 러의 쿼리를 보면 테이블이 전혀 사용되지 않는 것처럼 보입니다.
소스 코드를 검토하고 쿼리를 검색하는 것이 더 유용하며 모든 쿼리를 수집 한 후 빈도 (프로파일 러가 편리한 위치)가 아니라 사용 / 사용하지 않는 관점에서 데이터베이스 사용에 대해 잘 이해할 수 있습니다. 사용 된 테이블. 슬프게도, 수년간 코드베이스에 대해 잘못 작성되거나 유지되지 않는 경우 특히 쿼리가 동적으로 구성되는 경우 ( 매우select
테이블에서 테이블 이름으로 매개 변수를 사용하는 방법을 상상해보십시오 . 어떻게 할 수 있습니까?) 소스 코드를 보면서 매개 변수의 가능한 값을 알 수 있습니까?).
정적 분석 및 일부 컴파일러는 데드 코드도 공개 할 수 있지만 여전히 원하는 답변을 제공하지는 않습니다.
데이터 자체 또는 데이터베이스 메타 데이터를 분석하면 흥미로운 정보가 드러날 수 있습니다. 예를 들어, 테이블이 주장에 쉬울 LogonAudit(uniqueidentifier LogonAuditId, datetime LogonEvent, ...)
는 10 개 000 2006 2009 년에 하루 기록, 9 월에서 어떤 기록, 18이 포함 된 경우 더 이상 사용되지 않는 일을 , 2009 년 동일은에 대한 사실이 아니다 대부분 읽기 전용으로 들여 쓰기 된 데이터를 포함하는 테이블.
이 네 가지 점이 함께 사용 된 테이블 목록을 제공합니다. 나머지는 사용되거나 사용되지 않습니다. 어설 션을 작성하고 테스트 할 수 있지만 단위 테스트 범위가 충분하지 않으면 쉽지 않습니다. "쉬운"방법도 실패합니다. 예를 들어, 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
테이블을 사용한다는 것을 알 수 있습니까 ?
내가 만약 너라면 나는:
- 모든 데이터베이스 개체를 그대로 유지
- 전체 응용 프로그램을 리팩터링합니다 (가치가있는 경우).
- 애플리케이션 및 특히 데이터베이스 사용량을 문서화 (리팩토링하는 동안)하십시오.
마지막 두 단계를 마치면 더 이상 사용되지 않는 테이블의 이름을 파악하는 데 도움이되는 데이터베이스 사용법에 대해 더 잘 이해하게되며 다소 안전하게 제거 할 수 있습니다.