【问题标题】: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 会慢多少?
【问题讨论】:
标签:
android
android-sqlite
auto-increment
【解决方案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 次插入),例如:-
两个表的比较,突出了使用事务对性能的好处。