performance - SQLITE:关于使用 AUTOINCREMENT 的最佳实践
问题描述
根据官方手册:
“AUTOINCREMENT 关键字强加了额外的 CPU、内存、磁盘空间和磁盘 I/O 开销,如果不是严格需要,应避免使用。通常不需要。”
所以最好不要使用它?您是否有使用隐式 rowid 反对使用 AUTOINCREMENT 的基准?
解决方案
按照文档中的建议,最好不要使用 AUTOINCREMENT,除非您需要确保rowid的别名(又名 id)大于任何已添加的别名。但是,(在正常使用中)这是一个有争议的问题,因为即使没有 AUTOINCREMENT,直到您达到 9223372036854775807 行,然后才会产生更高的 rowid/id。
如果你确实达到了 9223372036854775807 的 id/rowid,那么如果你有 AUTOINCREMENT 编码,那就是它,因为会发生 SQLITE_FULL 异常。虽然没有 AUTOINCREMENT 会尝试获取未使用的 id/rowid。
AUTOINCREMENT 向 sqlite_sequence 添加一行(如果需要,则为表),记录最高分配的 id。有和没有 AUTOINCREMENT 的区别在于 sqlite_sequecence 表被引用,而没有 AUTOINCREMENT 则不是。因此,如果删除了具有最高 id 的行 AUTOINCREMENT 会从 sqlite_sequence 表中获得最高分配的 id (并且用户使用该或中的较大者max(rowid)
),但不会使用正在插入该行的表中的最高值(相当于max(rowid)
)。
根据在 Android 上使用 AUTOINCREMENT for SQLite 的开销是多少,通过有限的测试,发现 8-12% 的开销是开销? .
推荐阅读
- variables - PowerBI_variables_error 消息“无法将 Text 类型的值转换为 TRUE/FALSE 类型”
- javascript - 跨度悬停不起作用以及如何更改 div 之外元素的属性
- java - 在 Maven 项目中的包之间移动类时的常见问题
- laravel - Laravel:电子邮件未发送
- amazon-web-services - 已验证发送的域我如何验证它以在 AWS SES 中接收
- firebase - 关于扩展 Firebase 后端的问题
- c# - 使用 VLC 流式传输图像或桌面屏幕(LibVLCSharp for WPF)
- c# - 实现 IAsyncEnumerable 的空 IQueryable
- react-native - 通过 React Native 的 Axios 发布调用会导致云 url 的网络错误适用于 ios 而不适用于 android
- postgresql - 致命:用户“postgres”的密码验证失败。无法连接