虚拟列
VIRTUAL COLUMN是企业版功能。 如需获取许可证,请联系 Databend 支持团队。
虚拟列是通过提取Variant数据 中的嵌套字段并将其存储在单独的存储文件中形成的一种结构。当您经常查询Variant数据中的特定嵌套字段时,可以考虑使用虚拟列来实现以下好处:
-
加速查询处理:虚拟列通过消除遍历整个嵌套结构以定位所需数据的需求,简化了查询过程。直接从虚拟列中检索数据类似于访问常规列的过程,从而显著加快了查询执行速度。
-
减少内存使用:Variant数据通常包含大量内部字段,读取所有这些字段可能导致内存消耗巨大。通过转换为读取虚拟列,内存使用量显著减少,降低了潜在内存溢出的风险。
管理虚拟列
Databend提供了多种命令来管理虚拟列。详情请参阅VIRTUAL COLUMN。
使用示例
此示例展示了虚拟列的实际使用及其对查询执行的影响:
-- 创建一个名为 'test' 的表,包含 'id' 和 'val' 列,'val' 列类型为 Variant。
CREATE TABLE test(id int, val variant);
-- 为 'val' 列中的特定元素创建虚拟列。
CREATE VIRTUAL COLUMN (
val ['name'], -- 提取 'name' 字段。
val ['tags'] [0], -- 提取 'tags' 数组中的第一个元素。
val ['pricings'] [0] ['type'] -- 从 'pricings' 数组中的第一个定价中提取 'type' 字段。
) FOR test;
-- 向 'test' 表中插入一条包含 Variant 数据的示例记录。
INSERT INTO
test
VALUES
(
1,
'{"id":1,"name":"databend","tags":["powerful","fast"],"pricings":[{"type":"Standard","price":"Pay as you go"},{"type":"Enterprise","price":"Custom"}]}'
);
-- 解释从表中选择特定字段的查询执行计划。
EXPLAIN
SELECT
val ['name'],
val ['tags'] [0],
val ['pricings'] [0] ['type']
FROM
test;
-[ EXPLAIN ]-----------------------------------
TableScan
├── table: default.default.test
├── output columns: [val['name'] (#2), val['tags'][0] (#3), val['pricings'][0]['type'] (#4)]
├── read rows: 1
├── read bytes: 203
├── partitions total: 1
├── partitions scanned: 1
├── pruning stats: [segments: <range pruning: 1 to 1>, blocks: <range pruning: 1 to 1, bloom pruning: 0 to 0>]
├── push downs: [filters: [], limit: NONE, virtual_columns: [val['name'], val['pricings'][0]['type'], val['tags'][0]]]
└── estimated rows: 1.00
-- 解释仅从表中选择 'name' 字段的查询执行计划。
EXPLAIN
SELECT
val ['name']
FROM
test;
-[ EXPLAIN ]-----------------------------------
TableScan
├── table: default.default.test
├── output columns: [val['name'] (#2)]
├── read rows: 1
├── read bytes: 203
├── partitions total: 1
├── partitions scanned: 1
├── pruning stats: [segments: <range pruning: 1 to 1>, blocks: <range pruning: 1 to 1, bloom pruning: 0 to 0>]
├── push downs: [filters: [], limit: NONE, virtual_columns: [val['name']]]
└── estimated rows: 1.00
-- 显示系统中定义的所有虚拟列。
SHOW VIRTUAL COLUMNS;
┌─────────────────────────────────────────────────────────────────────────────┐
│ database │ table │ virtual_columns │
├──────────┼────────┼─────────────────────────────────────────────────────────┤
│ default │ test │ val['name'], val['pricings'][0]['type'], val['tags'][0] │
└─────────────────────────────────────────────────────────────────────────────┘
-- 删除与 'test' 表关联的虚拟列。
DROP VIRTUAL COLUMN FOR test;