2011-12-31 1 views
6

어떤 데이터베이스에 레코드를 삽입하기위한 가장 빠른 방법입니다 : 사용이 어떤 :PetaPoco 삽입 - 가장 빠른 방법?

  • Database.Insert(poco)
  • Database.Insert(tableName, pkName, poco)
  • Database.Save(poco)
  • Database.Save(tableName, pkName, poco) 하나는 내가 사용해야

성능상의 이유? 하나는 다른 사람보다 나에게 덜 편리하지 않다 ...

고마워.

public object Insert(string tableName, string primaryKeyName, bool autoIncrement, object poco) 

그리고 Database.Insert(tableName, pkName, poco)는 최소한의 작업을 수행합니다 (그것은 기본적으로 : PetaPoco 항상 데이터베이스 클래스의 다음 메소드를 호출처럼 나열된 모든 방법 4에서

답변

10

성능상의 이유로 어느 것을 사용해야합니까?

Database.Save 방법은 Database.Insert 또는 Database.Update 따라서 호출 GetValue를 사용하여 일차 키 필드 값을 검색한다.

따라서 코드가 실제로 새로운 항목이나 기존 항목 일 수있는 변경 내용을 저장할 필요가있는 경우에만 Database.Save을 사용해야합니다. 또한 테이블 Database.Save에 대한 자동 증가 기본 키 열이 있어야합니다 ().

약간의 성능 차이가 없어도 올바른 의미를 선호합니다 - 저장 또는 업데이트를 통해 삽입을 사용합니다.

하나는 정말 사실이 아니다 그 ...

다른 것보다 나에게 더 적은 편리하지 않습니다.

Database.Insert(poco)은 poco 클래스 정의에 대한 사용자 정의 속성에서 tableNamepkName에 대한 값을 찾습니다. T4 템플릿을 사용하면 이러한 값은 데이터베이스와 자동으로 동기화되며 한 위치에서만 지정됩니다. 반면에, 각각의 메소드 호출에서 이들을 전달하면 코드 기반 전체에서 무수히 반복됩니다. 마른. 나중에 값 중 하나를 변경해야하는 경우 어떻게해야합니까?

이제는 Database.Insert(poco)이 해당 검색으로 인해 성능이 약간 떨어집니다.그러나 성능에 미치는 영향이 첫 번째 조회 후 아주 작은 것, 그래서 PetaPoco는 정적 사전에 그 조회 결과를 캐시 :

RWLock.EnterReadLock(); 
PocoData pd; 
try 
{ 
    if (m_PocoDatas.TryGetValue(t, out pd)) 
     return pd; 
} 
finally 
{ 
    RWLock.ExitReadLock(); 
} 
+0

예,이 문 "하나가 다른 것보다 나에게 더 적은 편리하지 않습니다에 의해. .. ", 그것을 치료하기 위해 내가 한 일은 다음과 같습니다. http://blogs.msmvps.com/bmains/2011/12/31/helpful-petapoco-template-modifications/ DRY 위반, 예,하지만 성능면에서 좋습니다. 이것에 따라 : http://www.toptensoftware.com/Articles/94/PetaPoco-More-Speed. 나는 커스터마이징을 한걸음 더 나아가려고 노력할지도 모른다 ... –

+0

@BrianMains : 속도를 조금 더 늘릴 필요가 있니? 나는 잠시 동안 사용자 정의 된 SubSonic 템플릿으로 작업했습니다 (우리는 여전히 우리가 유지 관리하는 응용 프로그램에서이 템플릿을 사용합니다). 어쨌든, 나는 나의 대답에 명확하게 상충 관계를 놓았다고 생각한다. 당신은 확실하게 더 쉬운 경로를 유지하는 것이 더 빠른 경로를 선택할 수 있지만, 실제로는 거의 사용하지 않을 것입니다. 가장 큰 이득은 일괄 처리 작업, 준비된 진술, 적절한 색인 등입니다. –

+0

입력 해 주셔서 감사합니다. –

3

는 삽입을 위해, 그것은 본다 그냥 통과 방법), 그래서 나는 그것이 최고의 성능을 가진다고 가정합니다.

public object Insert(string tableName, string primaryKeyName, object poco) 
{ 
    return Insert(tableName, primaryKeyName, true, poco); 
} 

그것은 아마 직접 Insert(string, string, bool, object) 오버로드를 호출 약간 (그리고 unnoticeably) 빨리하는 것입니다 : 여기

Insert(string, string, object) 코드입니다.