我在一个支持SQLite 3的小型安卓应用程序上写作。ATM,我正在实现一些DB-函数,并问自己是否最好有一个大的连接查询,或者是否可以在AppPerformance方面使用多个查询。
假设我有三个表“驱动程序”、"driven_runs“、"race_disciplines”。每个driven_run都有一个驱动程序和一个race_discipline。让我们假设,我想得到所有的比赛规则,由一个特定的车手在一个特定的学科。
解决方案1
我已经编写了一个函数getDriver(driverID),返回了一个驱动对象,并编写了一个函数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);并手动创建驱动程序和DrivenRun对象。
这个解决方案需要更多的写入,但只执行一个查询(或者DB在连接3个表时也执行3个查询?)
长话短说,使用解决方案1可以吗?因为在性能方面没有太大的差别吗?
发布于 2013-01-12 15:58:53
通常,选择更简单的代码,直到有一个很好的性能理由不这样做。考虑到这是SQLite,我不认为会有多大的性能差异,因为查询的开销很低。
过早的优化是万恶之源。
发布于 2013-01-12 22:51:40
您应该使用正确的联接语法,这样查询就不会显得那么麻烦了:
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子句中插入适当的in。您的版本正在返回所有内容,这是完全不必要的。
这是一个非常简单的查询,它执行SQL数据库最好的操作--将大型表连接在一起。即使使用SQLite,您最好还是让数据库来完成这项工作。至少,它将节省一些从数据库层返回到应用层的往返通信。
在更复杂的环境中,数据库将利用多个处理器、多个磁盘和智能缓存结果来进一步优化查询响应。
https://stackoverflow.com/questions/14294967
复制相似问题