【问题标题】:Should I use pragmas or preprocessor macros in SQLite3?我应该在 SQLite3 中使用编译指示还是预处理器宏?
【发布时间】:2015-10-12 04:41:15
【问题描述】:

无论我使用 PRAGMA 还是预处理器宏,SQLite3 是否存在性能差异?

就我而言,我想知道PRAGMA foreign_keys = ON#define SQLITE_DEFAULT_FOREIGN_KEYS=1 在行为或性能方面是否有任何区别。

我倾向于使用 pragma 更灵活,但我想知道是否有一些性能损失。

附加问题:编译指示适用于连接的数据库是否正确。如果多个进程/线程访问同一个数据库并设置编译指示,是否会出现竞争条件?我假设pragma信息存储在硬盘的sqlite3文件中。

【问题讨论】:

  • 我会选择编译指示;在您创建架构时设置它们,其他开发人员不必查看您的构建系统来弄清楚为什么编译指示具有非默认值。如果您愿意,它还允许您使用系统的 sqlite 库。

标签: c++ performance sqlite c-preprocessor pragma


【解决方案1】:

PRAGMA 和默认设置之间没有速度差异。

此设置不适用于数据库,但适用于数据库连接,因此多个连接不会相互影响。

【讨论】:

  • 这意味着一个连接可以同时启用 WAL 模式和另一个 PERSIST?怎么会这样?另外,我认为外键是数据库的属性。两个数据库如何处理同一个数据库上的外键(或忽略它们)?我的任务是确保到同一个数据库的所有连接都具有相同的编译指示吗?
  • “这个设置”是 PRAGMA foreign_keys。其他 PRAGMA 有不同的效果。您可以在每个数据库中放置外键约束; PRAGMA 只是允许实际检查它们。
  • 对。因此,如果两个连接使用不同的 PRAGMA,其他设置可能会导致竞争条件,例如日记模式?
  • 对数据库文件的更改始终使用事务完成。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-16
  • 1970-01-01
  • 1970-01-01
  • 2010-10-19
  • 2011-08-18
  • 2021-02-03
  • 1970-01-01
相关资源
最近更新 更多