首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >安卓SQLite 3,连接还是多个查询?

安卓SQLite 3,连接还是多个查询?
EN

Stack Overflow用户
提问于 2013-01-12 15:49:51
回答 2查看 950关注 0票数 1

我在一个支持SQLite 3的小型安卓应用程序上写作。ATM,我正在实现一些DB-函数,并问自己是否最好有一个大的连接查询,或者是否可以在AppPerformance方面使用多个查询。

假设我有三个表“驱动程序”、"driven_runs“、"race_disciplines”。每个driven_run都有一个驱动程序和一个race_discipline。让我们假设,我想得到所有的比赛规则,由一个特定的车手在一个特定的学科。

解决方案1

我已经编写了一个函数getDriver(driverID),返回了一个驱动对象,并编写了一个函数getRaceDiscipline(disciplineID),作为回报使用了种族规则。所以我会创建一个函数

代码语言:javascript
复制
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

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

代码语言:javascript
复制
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可以吗?因为在性能方面没有太大的差别吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-12 15:58:53

通常,选择更简单的代码,直到有一个很好的性能理由不这样做。考虑到这是SQLite,我不认为会有多大的性能差异,因为查询的开销很低。

过早的优化是万恶之源。

票数 3
EN

Stack Overflow用户

发布于 2013-01-12 22:51:40

您应该使用正确的联接语法,这样查询就不会显得那么麻烦了:

代码语言:javascript
复制
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,您最好还是让数据库来完成这项工作。至少,它将节省一些从数据库层返回到应用层的往返通信。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14294967

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档