1

我正在编写一个支持 SQLite 3 的小型 Android 应用程序。ATM 我正在​​实现一些 DB-Functions 并问自己是否最好有一个大的连接查询,或者是否可以使用多个查询来提高应用程序的性能。

假设我有 3 个表“drivers”、“driven_runs”、“race_disciplines”。每个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

我会创建一个大的连接查询,比如

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 对象。

这个解决方案需要更多的编写,但只执行一个查询(或者数据库在连接 3 个表时也执行 3 个查询?)

长话短说,是否可以使用解决方案 1,因为在性能方面没有太大区别?

4

2 回答 2

3

一般来说,选择更简单的代码,直到有很好的性能理由不这样做。鉴于无论如何这都是 SQLite,我认为不会有太大的性能差异,因为查询的开销非常低。

过早的优化是万恶之源。

于 2013-01-12T15:58:53.133 回答
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,您最好还是让数据库来完成这项工作。至少,它将节省一些从数据库层到应用程序层的往返通信。

在更复杂的环境中,数据库将利用多处理器、多磁盘和智能缓存结果来进一步优化查询响应。

于 2013-01-12T22:51:40.337 回答