在 Android 上对 SQLite 使用 AUTOINCREMENT 的开销是多少?

What are the overheads of using AUTOINCREMENT for SQLite on Android?

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

The AUTOINCREMENT keyword imposes extra CPU, memory, disk space, and disk I/O overhead and should be avoided if not strictly needed. It is usually not needed.

The behavior implemented by the AUTOINCREMENT keyword is subtly different from the default behavior. With AUTOINCREMENT, rows with automatically selected ROWIDs are guaranteed to have ROWIDs that have never been used before by the same table in the same database. And the automatically generated ROWIDs are guaranteed to be monotonically increasing. These are important properties in certain applications. But if your application does not need these properties, you should probably stay with the default behavior since the use of AUTOINCREMENT requires additional work to be done as each row is inserted and thus causes INSERTs to run a little slower.

以上引述来自SQLite Autoincrement

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

我的估计是,我不是统计学家,开销大约是 8-12% 更慢。

我使用 3 结构相似且简单的 tables 获得了两个 TEXT 列的结果,运行ning 10,000 每个插入 table,在 4 台设备上重复 5 次。

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

Table 2(AI 列) 除了两个 TEXT 列之外,还使用 ​​_id INTEGER PRIMARY KEY AUTOINCREMENT 创建。

Table 3(无 AI 列) 除了两个 TEXT 列之外,还使用 ​​_id INTEGER PRIMARY KEY 创建。

因此 Table 2 使用 稍微不同的 ROWID 选择算法 插入。

使用的四个设备是:-

  • (1) Genymotion 仿真设备(自定义 Tablet - 5.1.0 - API 22 - 1536x2048 )

  • (2) Onix 10" tablet (AT101-1116 )

  • (3) 一台 HTC 1 M8 (HTC_0PKV1 )

  • (4) 一台联想 A10-30 tablet (联想 TB2-X30F )

    我得到的结果是:-

如果仅在 1 个事务中一切都是 运行(即在任何插入之前 beginTransaction();,在所有插入之后 setTransactionSuccessful();endTransaction();(对于所有 tables 即整个 150,000 个插入),例如:-

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