哈希和自动标识符
如索引基础概念页面中介绍的,在内存数据库中,SmartEDB 的哈希索引在精确匹配搜索方面比树索引更高效。SmartEDB 提供了针对相关类为临时类时在内存中高效操作而修改的哈希索引算法。哈希索引通常在插入和查找操作的平均性能方面优于树索引,但这取决于初始哈希表的大小以及键的分布情况。
在理想情况下,哈希表的大小应设置为包含每个被索引的数据库对象的一个条目(有时称为“桶”),这意味着只需一次哈希表查找(一个简单的哈希函数计算)即可访问每个数据库对象。但实际上,无论表的大小如何,哈希函数都不能保证生成唯一的值,因此多个索引值可能会映射到同一个桶(称为“冲突”),从而导致形成一个对象指针的链表(称为“冲突链”)。
因此,如果事先已知数据库对象的数量,那么在索引的架构声明中指定此数量,这将带来最佳性能。但倘若无法以合理的可信度确定数据库对象的数量,SmartEDB 运行时会在需要时动态分配额外的哈希表空间。
当声明为唯一(这是默认设置)时,哈希索引只能用于精确匹配搜索或无序列表检索。精确匹配搜索通过所选 API 的 find 操作执行。然而,哈希索引可以声明为非唯一,以允许具有相同哈希表条目的重复值被存储。当声明为非唯一时,可以执行搜索操作以选择具有指定哈希值的所有对象。
内存消耗
对于瞬态类的树索引和哈希索引,内存消耗是相当的。树索引的粗略估计是每个条目 10 字节(确切大小取决于插入或删除的顺序);哈希索引则是每个条目 H + 8 字节,其中常量 H 是哈希表所占用的固定大小空间,可计算为 E / 5 * 4,E 是您在数据库模式中提供的哈希条目的估计数量,5 是 SmartEDB 所使用的常量哈希因子。如果需要重新分配哈希表,则大小将是 H * 2。
自动标识索引
自动标识声明指明一个类是通过系统生成的唯一标识符进行存储的。自动标识是 SmartEDB 运行时生成的保证唯一的值,并存储在内部哈希索引中。新数据库对象的自动标识值在其创建的瞬间插入到索引哈希表中,并且永远不会更改。(请注意,这与其他类型的索引不同。通常情况下,新值是在包含创建或更新这些值的事务提交时或执行事务检查点时插入到索引(哈希表或树结构)中的。)
自动标识字段基于无符号 64 位整数。最初,在数据库创建阶段,所有计数器都初始化为零。在数据库的整个生命周期内,每当创建一个类对象时,计数器就会增加。SmartEDB 永远不会减少自动标识值,也不会重复使用相同的值。不过从技术上讲,计数器有可能溢出,在这种情况下,计数器会开始重复值。但请注意,如果每毫秒创建一个自动标识,计数器将在 6,405,119,470,038 天(超过 1700 万年)后才会溢出!
对象标识符索引
C API 允许定义独特的对象标识符(oid)结构,这可以非常高效。更多详情请参阅 C API 索引页面。