持久数据库索引优化
游标预读缓冲
导航索引结构可能需要访问索引“叶”节点的许多页面。例如,对基于磁盘的B-Tree索引执行顺序遍历的应用程序将对每个索引页执行阻塞式读访问。这可能会带来很大的性能成本。为了减少代价高昂的读取操作,运行时将几个索引页读入内部游标缓冲区。每次访问时从B-Tree页的叶子中获取的键数由传递给mco_db_open_dev()
的mco_db_params_t
中的数据库参数btree_cursor_read_ahead_size
的值决定。该值可以修改,但不能大于配置参数MCO_CFG_CURSOR_BUF_SIZE
的值,配置参数的默认值为10。
注意,要更改MCO_CFG_CURSOR_BUF_SIZE
等配置参数,需要SmartEDB源代码许可。
块分配
SmartEDB提供了一个块分配器来促进对象引用的局部性,即确保一组对象将存储在持久介质上的连续块中。
此功能以生成的函数<classname>_set_allocation_block_size()
的形式提供。应用程序在READ_WRITE
事务中调用该函数,该事务具有足够的块大小来存储给定类的一组对象。这个函数为持久对象提供了主要的性能改进:
将整个对象保持在同一个块内,大大提高了复杂对象的读取性能;
将同时添加到数据库的对象组存储在同一个块中,从而提高了同一类对象的顺序访问性能。
当使用<classname>_set_allocation_block_size()
时,删除classname
的对象,将空间返回给数据库池,可用于索引和其他对象。但是这个空间不会被同一类的对象重用,因为这些新对象是由块分配的。因此,删除对象不会减少引用的局部性。
块分配器在对象不更新时工作得很好,因为当动态对象更新时,对象的一部分(可变长度部分)可能会在块外分配。为了减少这种影响,运行时总是尝试将整个对象分配到与对象头相同的页(磁盘管理器页)上。
注意,通过使用打开或扩展数据库时使用的mco_db_params_t
结构的file_extension_quantum
元素,也可以大大减少数据库文件碎片,可参阅函数mco_db_open_dev()
。file_extension_quantum
的非零值将导致数据库运行时按指定的字节数增长数据库文件,而不是按页面大小(通常为4K、8K或16K)增长数据库文件。