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

时间:2017-07-29 03:24:29

标签: android android-sqlite auto-increment

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

  

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

  

AUTOINCREMENT关键字实现的行为是巧妙的   与默认行为不同。使用AUTOINCREMENT,行   自动选择的ROWID保证具有ROWID   以前从未在同一个数据库中使用同一个表。而且   自动生成的ROWID保证是单调的   越来越多。这些是某些应用中的重要属性。   但是如果你的应用程序不需要这些属性,你应该这样做   可能会保留自使用AUTOINCREMENT以来的默认行为   在插入每一行时需要完成额外的工作   导致INSERT运行得慢一些。

以上引用来自SQLite Autoincrement

那么预期会产生什么样的影响,以及AUTOINCREMENT的速度有多慢?

1 个答案:

答案 0 :(得分:2)

我的估计,即我不是统计学家,是开销有点像 8-12%慢。

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

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

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

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

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

使用的四种设备是: -

  • (1)Genymotion仿真设备(自定义平板电脑 - 5.1.0 - API 22 - 1536x2048 )

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

  • (3)HTC 1 M8(HTC_0PKV1 )

  • (4)Lenevo A10-30平板电脑(Lenovo TB2-X30F )

    我获得的结果是: -

enter image description here

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

enter image description here

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