打开模式
mode mask参数
数据库参数 mco_db_params_t 结构中的 mode_mask 可以设置以下值:
MCO_DB_MODE_MVCC_AUTO_VACUUM
当打开数据库时,会自动清理过期版本(多版本并发控制)。
此模式可用于在基于磁盘的数据库应用程序崩溃后恢复时删除对象的过时版本。此过程可能需要大量时间,因为它在启动时会读取数据库文件以扫描数据库。(因此它不是默认模式。)如果基于磁盘的数据库是正常关闭的,那么下一次运行不应使用此选项。但在数据库崩溃后(甚至多次崩溃后)恢复时,可以使用
MCO_DB_MODE_MVCC_AUTO_VACUUM模式来减小其大小。MCO_DB_MODE_SMART_INDEX_INSERT
使运行时在将事务数据包含到索引之前,根据为类声明的第一个索引对其进行预排序。在处理非常大的磁盘索引和大量事务时,这可以优化索引树结构。(这种好处可能不太明显,并且在很大程度上取决于数据库模式。因此,此模式不是默认模式。)
MCO_DB_OPEN_EXISTING
指示运行时不要初始化一个全内存数据库,而是将数据库内存设备视为已初始化的内存空间。例如,基于
NVRAM的设备可能会关闭或断电。然后,在下一次启动时,实际上它已经初始化并填充了NV内存。因此,在MCO_DB_OPEN_EXISTING模式下,运行时只需打开该内存,假定它已在上一次运行中初始化。MCO_DB_USE_CRC_CHECK
指示运行时计算并存储每个数据库页的循环冗余校验(CRC)。
MCO_DB_TRANSIENT
强制所有数据库类都为“内存中”(瞬态)的,即便这些类在数据库模式中被声明为持久化的。这可能有助于在测试目的时临时覆盖持久化类的定义。
MCO_DB_LAZY_MEM_INITIALIZATION
默认情况下,运行时会初始化所有给定的内存:将其分割成页,并将这些页链接到页管理器的列表中。但对于非常大的数据库(数吉字节),这可能会花费相当长的时间。使用此运行时选项,内存将按需“格式化”,这将把内存页的初始化过程从初始化阶段推迟到每个数据库页首次使用时。因此,它以数据访问期间的性能为代价加快了数据库的初始化速度。此选项不是默认选项,因为它在页分配期间增加了一次额外检查;并且通过提前初始化内存,为数据库预留了物理内存,从而减少了数据库访问时间。
MCO_DB_INMEMORY_PROTECTION
启用运行时实现页面级加密。如果标志
MCO_DB_INMEMORY_PROTECTION和mco_db_params_t::cipher_key被设置,则临时数据库的内存页面将通过当前可用的对称加密算法进行加密。然而,这种组合与磁盘管理器不兼容,因此不适用于混合数据库(即同时具有临时类和持久类的数据库)。MCO_DB_INCLUSIVE_BTREE
允许运行时利用 CPU 缓存内存来处理数据结构和算法,在很多情况下,这能显著提高性能,优于普通 RAM 访问。当索引 B 树结构非常大时,此选项尤其有效。
MCO_DB_INMEMORY_COMPRESSION
该功能使运行时能够通过数据压缩来节省内存。如果设置了标志
MCO_DB_INMEMORY_COMPRESSION且mco_db_params_t::cipher_key已设定,那么临时数据库页面将同时被压缩和加密。然而,这种组合与磁盘管理器不兼容,因此不适用于混合数据库(即同时具有临时类和持久类的数据库)。MCO_DB_SEPARATE_BITMAP
允许运行时为对齐和未对齐的内存对象使用单独的内存分配位图页面。这有助于避免持久性数据库的磁盘文件碎片。将对象放在一起(按顺序)可以显著加快线性搜索。对于内存数据库,引用的局部性不是那么关键(尽管顺序访问更快,尤其是在 NUMA 情况下)。但是对于 SmartEDB 持久性数据库,有两种方法可以提高引用的局部性:
通过使用分配块:当特定的块(通常为几兆字节)用于特定类对象的分配时。
通过设置
MCO_DB_SEPARATE_BITMAP标志。在这种情况下,索引页和对象页将使用不同的分配器进行分配。
这允许更好地对记录进行分组并减少碎片。但它可能会导致更大的磁盘空间消耗。
MCO_DB_MURSIW_DISK_COMMIT_OPTIMIZATION
在使用 MURSIW 事务管理器时,此标志会促使运行时将修改过的页面保存到事务日志文件,并在临界区之外刷新日志,从而允许只读事务进行处理。这可能会提高并发性,并减少事务处理期间的延迟。
MCO_DB_BULK_WRITE_MODIFIED_PAGES
这会导致运行时对所有未固定且已修改的页面进行排序并写入,而不是仅在从磁盘加载新页面时将磁盘页面池中丢弃的单个已修改页面写入。这样可以减少磁盘磁头移动,但可能的缺点是已修改的页面可能会被多次写入。
MCO_DB_DISABLE_PAGE_POOL_RESERVE
对于持久性数据库,缓存内存有可能耗尽。为此,在缓存中添加了一个“预留池”页面。运行时会自动分配此额外的缓存内存,除非将此标志设置为禁用预留页面池。
MCO_DB_INDEX_PRELOAD
这会使运行时尝试使用系统函数 fadvise() 预加载下一个 B 树页面。这可能会提高顺序扫描的速度。
在 Linux 上,
fadvise()可能会导致同步页面读取,这很可能会降低性能。MCO_DB_DISABLE_NESTED_TRANSACTIONS
此标志会使运行时禁用嵌套事务。如果在提交或回滚之前调用
mco_trans_start(),则会引发错误MCO_ERR_NESTED_TRANS_TRAP。MCO_DB_DISABLE_IMPLICIT_ROLLBACK
使运行时在断开连接时不隐式回滚活动事务。相反,会报告错误。这可用于调试意外的事务嵌套。
MCO_DB_DISABLE_BTREE_REBALANCE_ON_DELETE
导致运行时在删除对象时禁用 B 树的重新平衡。大多数频繁的删除操作之后会跟着插入操作,所以重新平衡 B 树会极大地降低性能。但禁用这种重新平衡可能会导致树的非最优状态(存在大量几乎为空的页面)。
MCO_DB_AUTO_ROLLBACK_FIRST_PHASE
如果两阶段提交的第一阶段提交失败,那么此标志会致使运行时隐式回滚事务,而无需等待应用程序调用
mco_trans_rollback()。这并非两阶段提交的默认行为,因为在某些情况下,如果网络中某些节点上的事务第一阶段失败,其他节点可能需要显式回滚其事务。MCO_DB_MVCC_COMPATIBILITY_MODE
使用 MVCC 事务管理器创建的持久数据库,可以通过使用 MURSIW 事务管理器的应用程序(或 xSQL)打开。也可以通过在配置文件的 db_params:mode_mask 部分设置模式掩码,指示 xSQL 以事务管理器兼容模式打开数据库。
MCO_DB_DISABLE_PAGE_POOL_RESERVE
默认情况下,如果可用(未固定)页面的最小数量阈值达到,运行时将设置事务错误代码,阻止当前事务提交。设置此标志会使运行时不在页面池中预留空间,从而允许其使用页面池中的所有内存,从而有可能完成任何活动事务。
MCO_DB_REDO_LOG_OPTIMIZATION
默认情况下,使用重做日志选项时,事务大小受页池大小的限制。这种限制可能会阻止应用程序执行诸如创建表或索引之类的操作,因为事务大小实际上受可用内存的限制。可以设置此标志,以便在许多情况下运行时允许事务大小超过池页大小。
MCO_DB_DISABLE_HOT_UPDATES
如果更新操作修改了索引键,则允许不更新索引。“热更新”可能会增加搜索时间,因为搜索必须遍历热更新链才能找到正确的对象。如果更新相对较少且搜索速度更为关键,那么通过设置此标志禁用热更新可能会很有用。
MCO_DB_SQL_AUTOCHECKPOINT
这会导致所有新创建的数据库对象都被插入到已定义的索引中,以便在事务内访问这些对象时无需显式调用检查点 API。
MCO_DB_MODE_READ_ONLY
如果标志已设置,
READ_WRITE或UPDATE事务将返回MCO_E_ACCESS错误代码。此外,如果分配给持久性数据库(MCO_MEMORY_FILE、MCO_MEMORY_MULTIFILE或MCO_MEMORY_RAID)的文件设备被检测为只读,数据库运行时会自动将MCO_DB_MODE_READ_ONLY添加到打开数据库的模式掩码中。请注意,对于持久性数据库,日志文件必须保持可写。如果日志设备文件被设为只读,或者如果应用程序为日志设备设置了MCO_FILE_OPEN_READ_ONLY标志,则会引发致命异常。另外,数据库(无论是持久性的还是临时性的)都可以通过
mco_db_load_*()API(或相应的 Java、C# 或 Python API)从先前保存的映像中加载。在这种情况下,数据库被加载并设为只读,因此不允许对数据库进行进一步修改。MCO_DB_USE_AIO
如果设置了该标志,则对持久数据库写入使用异步 I/O。默认情况下,为每个数据库启动一个 AIO 线程,并且默认队列大小设置为 10007。有时更改 AIO 线程的数量(例如,如果数据库由多个物理 I/O 设备组成,或者位于 RAID 上)和/或队列大小可能会带来好处。但请注意,无论应用程序传递的工作者线程数是多少,I/O 线程的数量都不会超过进程创建的数据库数量(运行时不允许一个 AIO 线程为多个数据库服务)。
MCO_DB_INCREMENTAL_BACKUP
此标志控制数据库页面的增量备份支持标记。若未启用此标志,仍可进行备份,但仅能创建快照,因为数据库引擎不会跟踪页面的修改情况。可在运行时使用
mco_backup_incremental_processing_get()和mco_backup_incremental_processing_set()获取状态并启用或禁用增量备份处理。MCO_DB_MVCC_TABLE_LEVEL_LOCKING
仅在使用 MVCC 事务管理器时,指示运行时在数据库操作期间锁定整个表的空间,而非选择性实例。此选项对数据库性能的影响取决于应用程序的数据库访问模式。
MCO_DB_DISABLE_SMART_ALLOC
此标志会影响对象的分配。当设置此标志时,SmartEDB 运行时会根据统计信息计算出的平均对象大小来分配空间。在某些情况下,这可能很有用,因为它在分配前进行截断,并减少了对象分配时的完整映射重新扫描次数。
