生成的列

生成的列在表中定义,在这些列中,存储的值是使用表达式计算得出的,而不是通过插入或更新操作指定。

当创建已知始终要使用特定表达式或谓词的表时,可对该表添加一个或多个生成列。 通过使用生成列,有机会在查询表数据时改进性能。

例如,当性能很重要时,以下两种表达式求值方式成本很高:
  1. 必须在查询期间进行许多次表达式求值。
  2. 计算很复杂。

为了改进查询的性能,可定义一个其他列,它将包含该表达式的 结果。 然后,当发出包括同一表达式的查询时,可直接使用生成列,或者,优化器的查询重写组件可用生成列替换该表达式。

当查询涉及连接两个或更多表中的数据时,添加生成列允许优化器 选择可能更好的连接策略。

将使用生成列来改进查询的性能。 结果是,可能在创建和填充表之后添加 生成列。

示例

以下是在 CREATE TABLE 语句上定义生成列的一个示例:
   CREATE TABLE t1 (c1 INT,
                    c2 DOUBLE,
                    c3 DOUBLE GENERATED ALWAYS AS (c1 + c2)
                    c4 GENERATED ALWAYS AS
                       (CASE WHEN c1 > c2 THEN 1 ELSE NULL END))
在创建此表之后,可以使用生成列来创建索引。 例如,
CREATE INDEX i1 ON t1(c4)
查询可以利用生成列。 例如,
SELECT COUNT(*) FROM t1 WHERE c1 > c2
可以编写为:
 SELECT COUNT(*) FROM t1 WHERE c4 IS NOT NULL
另一个示例:
SELECT c1 + c2 FROM t1 WHERE (c1 + c2) * c1 > 100
可以编写为:
SELECT c3 FROM t1 WHERE c3 * c1 > 100