虚拟列和函数索引有什么区别?

【 使用环境 】生产环境 or 测试环境
【 OB or 其他组件 】
【 使用版本 】
【问题描述】虚拟列和函数索引有什么区别?

3 个赞

@论坛小助手

1 个赞

虚拟列和函数索引的区别

根据OceanBase文档中的信息,虚拟列(Virtual Column/Generated Column)和函数索引(Function Index)在数据库中有着不同的用途和实现方式。下面是它们的主要区别:

  1. 定义与使用

    • 虚拟列是在表定义时创建的一种特殊类型的列,其值是基于同一表中的其他一列或多列的数据通过一个表达式计算得到的。它不占用额外的物理存储空间,而是在查询该列时实时计算结果。
    • 函数索引则是针对特定的函数应用结果建立的索引。这允许将对函数调用的结果进行缓存,从而加速涉及这些函数的查询处理速度。
  2. 数据存储机制

    • 对于虚拟列来说,虽然定义了一个表达式来产生列值,但实际并不为该列分配单独的存储区域。每次访问此列时都会重新计算这个表达式的值。
    • 相比之下,函数索引确实会占用额外的空间来保存函数运算的结果,以便后续能够直接从索引中读取预计算好的数据,而不是每次都执行相同的函数操作。
  3. 应用场景

    • 虚拟列非常适合那些需要经常查看某些复杂计算结果但又不想为此专门增加存储成本的情况。例如,如果你有一个订单表,并希望显示每笔订单金额加上税费后的总价,就可以定义这样一个虚拟列。
    • 函数索引适用于当你的应用程序频繁地基于某个固定模式查询数据,尤其是涉及到复杂的条件或转换时。如上文提到的例子所示,在sale表中经常按月份筛选记录时,通过创建关于month(date_col)的函数索引能显著提高此类查询的速度。
  4. 创建示例

    • 创建虚拟列
      CREATE TABLE t (id INT, date DATE, sales DECIMAL,
                      total_price AS (sales * 1.1) VIRTUAL);
      
    • 创建函数索引
      CREATE INDEX idx_month ON sale((MONTH(date_col)));
      

综上所述,两者都是为了优化数据库性能而设计的不同策略:虚拟列侧重于逻辑上的简化而不增加物理存储负担;函数索引则旨在通过预先处理和缓存某些计算结果来提升查询效率。

表概述 → 列
创建索引 → 创建函数索引

具体信息可参考以下文档:

  1. 列存 FAQ
  2. 数据库中的视图
  3. 创建索引
  4. 性能视图
  5. 表概述
  6. 函数索引不支持的系统函数列表
  7. SELECT
  8. 表存储
  9. 分区索引
  10. 集群管理 FAQ
1 个赞