2013-01-12 72 views
1

我正在寫一個支持SQLite 3的小型Android應用程序。自動櫃員機我正在實施一些數據庫函數,並問自己,如果最好有一個大的加入查詢,或者如果可以在應用程序性能方面使用多個查詢。Android SQLite 3,JOINS或多個查詢?

比方說,我有一個3表「驅動程序」,「driven_runs」,「race_disciplines」。每個driven_run都有一個驅動程序和一個race_discipline。假設我想在某個學科中獲得某個駕駛員的所有種族學科。

溶液1

我已經與返回駕駛員對象和功能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個查詢以及加入3個表什麼時候?)

長話短說,是OK去與解決方案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 

而且,只返回你所需要的列。其次,在where條款中插入適當的ID。你的版本正在返回一切,這是完全不必要的。

這是一個非常簡單的查詢,它可以完成SQL數據庫最擅長的工作 - 將大表連接在一起。即使使用SQLite,你最好讓數據庫完成這項工作。至少,它將從數據庫層保存一些往返通信迴應用層。

在更復雜的環境中,數據庫將利用多個處理器,多個磁盤並智能地緩存結果以進一步優化查詢響應。