1

私は SQLite 3 をサポートする小さな Android アプリを書いています。ATM 私はいくつかの DB 関数を実装しており、アプリケーションのパフォーマンスに関して、1 つの大きな結合クエリを使用する方がよいのか、それとも複数のクエリを使用してもよいのかを自問しています。

「drivers」、「driven_runs」、「race_disciplines」の 3 つのテーブルがあるとします。すべての Driven_run には、ドライバーと race_discipline があります。特定の分野の特定のドライバーによるすべてのレース分野を取得したいとします。

解決策 1

Driver-Object を返す関数 getDriver(driverID) と、Race Discipline を返す関数 getRaceDiscipline(disciplineID) を既にコーディングしています。だから私はちょうど関数を作成します

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

次のような1つの大きな結合クエリを作成します

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);

Driver と DrivenRun オブジェクトを手動で作成します。

このソリューションにはさらに多くの書き込みが必要ですが、実行されるクエリは 1 つだけです (または、DB は 3 つのテーブルを結合するときに 3 つのクエリも実行しますか?)

簡単に言えば、パフォーマンスに関してはあまり違いがないので、ソリューション 1 を使用しても問題ありませんか?

4

2 に答える 2

3

一般に、パフォーマンス上の理由が十分にあるまでは、より単純なコードを選択してください。とにかくこれがSQLiteであることを考えると、クエリのオーバーヘッドはかなり低いので、パフォーマンスの違いはあまりないと思います。

時期尚早の最適化はすべての悪の根源です。

于 2013-01-12T15:58:53.133 に答える
2

You should use proper join syntax, then your query won't look so cumbersome:

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

Also, only return the columns that you need. Second, insert the appropriate ids in the where clause. Your version is returning everything, which is totally unnecessary.

This is a pretty simple query and it does what SQL databases do best -- joining large tables together. Even with SQLite, you are probably better off letting the database do the work. It is, at the very least, going to save some round trip communication from the database layer back to the application layer.

In a more sophisticated environment, the database will take advantage of multiple processors, multiple disks, and intelligently cache results to further optimize query response.

于 2013-01-12T22:51:40.337 に答える