在 Android 上为 SQLite 使用 AUTOINCREMENT 的开销是啥?

Posted

技术标签:

【中文标题】在 Android 上为 SQLite 使用 AUTOINCREMENT 的开销是啥?【英文标题】:What are the overheads of using AUTOINCREMENT for SQLite on Android?在 Android 上为 SQLite 使用 AUTOINCREMENT 的开销是什么? 【发布时间】:2018-01-05 04:44:55 【问题描述】:

在 SQLite 文档中,它包括以下内容:-

AUTOINCREMENT 关键字强加了额外的 CPU、内存、磁盘空间和 磁盘 I/O 开销,如果不是严格需要,应该避免。它是 通常不需要。

AUTOINCREMENT 关键字实现的行为很巧妙 与默认行为不同。使用 AUTOINCREMENT,行 自动选择的 ROWID 保证具有 以前从未被同一个数据库中的同一张表使用过。和 保证自动生成的 ROWID 是单调的 增加。这些是某些应用中的重要特性。 但如果您的应用程序不需要这些属性,您应该 自使用 AUTOINCREMENT 以来可能保持默认行为 需要在插入每一行时完成额外的工作,因此 导致 INSERT 运行速度稍慢。

以上引用来自SQLite Autoincrement

那么预计会产生什么样的影响,AUTOINCREMENT 会慢多少?

【问题讨论】:

【参考方案1】:

注意到我不是统计学家,我的估计是开销会慢 8-12%

我使用具有两个 TEXT 列的 3 结构相似且简单的 获得了结果,每个表运行 10,000 个插入,重复这 5 4 台设备上的时间。

表 1(Dflt 列)仅使用两个 TEXT 列创建(因此使用默认 ROWID)。

表 2(AI 列)是使用 _id INTEGER PRIMARY KEY AUTOINCREMENT 和两个 TEXT 列创建的。

表 3(无 AI 列)是使用 _id INTEGER PRIMARY KEY 和两个 TEXT 列创建的。

所以表2使用略有不同的ROWID选择算法进行插入。

使用的四个设备是:-

(1) Genymotion 模拟设备(自定义平板电脑 - 5.1.0 - API 22 - 1536x2048 )

(2) Onix 10" 平板电脑 (AT101-1116 )

(3) HTC 1 M8 (HTC_0PKV1 )

(4) 一台联想 A10-30 平板电脑(联想 TB2-X30F )

我得到的结果是:-

当一切都在 1 个事务中运行时结果更有利(即在任何插入之前beginTransaction();,在所有插入之后使用setTransactionSuccessful();endTransaction();(对于所有表,即整个 150,000 次插入),例如:-

两个表的比较,突出了使用事务对性能的好处。

【讨论】:

以上是关于在 Android 上为 SQLite 使用 AUTOINCREMENT 的开销是啥?的主要内容,如果未能解决你的问题,请参考以下文章

在 iphone 上为 sqlite 将 json 转换为 const char

如何在 Windows 上为 Ruby 安装 sqlite3?

在 SQLite xp 系统上为奖励积分添加冷却时间

Android:在 MapView 上为 ItemizedOverlay 使用 9-patch 和文本

在 Qt 上为 Android 设计 GUI 的技术

在 Android 上为 PhoneGap App 更改应用程序主题(使用 phonegap Build)