2013-01-12 2 views
1

SQLite 3을 지원하는 작은 Android 앱을 쓰고 있습니다. ATM 일부 DB-Functions를 구현하고 하나의 커다란 결합 된 쿼리를 사용하는 것이 더 나은지 또는 앱 성능과 관련하여 여러 쿼리를 사용하는 것이 괜찮은지 스스로에게 묻습니다.Android SQLite 3, JOINS 또는 여러 검색어?

내가 3 개의 테이블 "드라이버", "driven_runs", "race_disciplines"를 가지고 있다고 가정 해 보겠습니다. 모든 driven_run에는 드라이버와 race_discipline이 있습니다. 특정 분야의 특정 운전자에 의한 모든 인종 훈련을하고 싶다고 가정 해 봅시다.

이미 대가 드라이버 - 객체 및 반환에 레이스 징계와 함수 getRaceDiscipline (disciplineID)와 함수 getDriver (driverID)를 코딩 한

솔루션. 그래서 함수를 만들면됩니다.

public ArrayList<DrivenRun> getDrivenRunsOnDiscipline(short driverID, short disciplineID) { 
    ArrayList<DrivenRun> drivenRuns = new ArrayList<DrivenRun>(); 
    String sql = "SELECT * FROM " + DBHelper.TABLE_DRIVEN_RUNS + " WHERE " 
      + DBHelper.DRIVEN_RUNS_COLUMN_DRIVER_ID + "=" + driverID + " AND " 
      + DBHelper.DRIVEN_RUNS_COLUMN_RACE_DISCIPLINE_ID + "=" + disciplineID + ";"; 
    Cursor result = rawQuery(sql); 
    if (result.moveToFirst()) { 
     do { 
      Driver driver = getDriver(driverID); 
      RaceDiscipline discipline = getRaceDiscipline(disciplineID); 
      DrivenRun run = new DrivenRun(); 
      run.setDriver(driver); 
      run.setDiscipline(discipline); 
      run.setResult("WHATEVER"); 
      drivenRuns.add(run); 
     } while(result.moveToNext()); 
    } 
    return drivenRuns; 
} 

이 경우 3 개의 쿼리가 차례로 실행되지만 코딩은 훨씬 간단합니다. 나는 하나 개의 큰를 만들 것 2

솔루션

String sql = "SELECT * FROM driven_runs CROSS JOIN drivers CROSS_JOIN race_disciplines WHERE driven_runs.driver_id=drivers.id AND driven_runs.race_discipline_id=race_disciplines.id" 
Cursor result = rawQuery(sql); 

같은 쿼리에 합류 수동으로 드라이버 및 DrivenRun 개체를 만들 것입니다. (3 개 테이블을 조인 할 때 또는 DB뿐만 아니라 3 개 쿼리를 실행합니까?)

이 솔루션은 훨씬 더 쓰기를 필요로하지만, 단 하나의 쿼리가 실행되는

가에 있기 때문에 솔루션 1로 이동하는 것을 확인

길고도 짧은 이야기 입니다 성능에 관해서는별로 차이가 없다.

답변

2

일반적으로 좋은 성능을 내지 못할 때까지 간단한 코드로 이동하십시오. 어쨌든 이것이 SQLite 인 것을 감안할 때 쿼리에 대한 오버 헤드가 매우 낮기 때문에 성능 차이가있을 것으로 생각하지 않습니다.

조숙 한 최적화는 모든 악의 근원입니다. 당신은 조인 구문을 적절히 사용해야

2

, 다음 쿼리는 너무 복잡 보이지 않는 것 :

SELECT THECOLUMNSYOUREALLYNEED 
FROM driven_runs JOIN 
    drivers 
    on driven_runs.driver_id=drivers.id join 
    race_disciplines 
    on driven_runs.race_discipline_id=race_disciplines.id 
where driver.id = YOURDRIVEIDHERE and race_discipline = YOURDISCIPLINEIDHERE 

는 또한, 단지 당신이 필요로하는 열을 반환. 둘째, 적절한 ID를 where 절에 삽입하십시오. 귀하의 버전은 모든 것을 반환하고 있으며 이는 전혀 필요하지 않습니다.

이것은 매우 간단한 쿼리로, SQL 데이터베이스가 가장 잘 수행하는 작업 (대용량 테이블 결합)을 수행합니다. SQLite를 사용하더라도 데이터베이스 작업을하는 것이 더 나을 것입니다. 적어도 최소한 데이터베이스 계층에서 응용 프로그램 계층으로의 왕복 통신을 저장하려고합니다.

보다 정교한 환경에서 데이터베이스는 여러 프로세서와 여러 디스크를 활용하고 결과를 지능적으로 캐시하여 쿼리 응답을 최적화합니다.

관련 문제