在 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?