生成的列
生成的列在表中定义,在这些列中,存储的值是使用表达式计算得出的,而不是通过插入或更新操作指定。
当创建已知始终要使用特定表达式或谓词的表时,可对该表添加一个或多个生成列。 通过使用生成列,有机会在查询表数据时改进性能。
例如,当性能很重要时,以下两种表达式求值方式成本很高:
- 必须在查询期间进行许多次表达式求值。
- 计算很复杂。
为了改进查询的性能,可定义一个其他列,它将包含该表达式的 结果。 然后,当发出包括同一表达式的查询时,可直接使用生成列,或者,优化器的查询重写组件可用生成列替换该表达式。
当查询涉及连接两个或更多表中的数据时,添加生成列允许优化器 选择可能更好的连接策略。
将使用生成列来改进查询的性能。 结果是,可能在创建和填充表之后添加 生成列。
示例
以下是在 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