最佳实践

设计建议

从业务场景出发定义语义视图

一个语义视图应对应一个清晰的分析域,如"员工薪资分析"或"订单收入分析",而不是把所有表都塞进同一个视图。聚焦的视图更容易维护,查询性能也更好。建议从 3–5 张核心表开始,验证维度和指标的准确性后再逐步扩展。

使用业务术语命名

为逻辑表、维度、指标选择业务用户熟悉的名称,而不是物理列名的直接映射:

-- 推荐 emps.avg_salary AS AVG(emps.salary) -- 平均薪资 customers.customer_name AS c.c_name -- 客户名称 -- 不推荐 emps.avg_salary_col AS AVG(emps.salary) -- 带 _col 后缀,不自然 c.c_name_field AS c.c_name -- 保留了物理字段命名风格

善用

WITH SYNONYMS
WITH SYNONYMS
COMMENT
COMMENT
增强可发现性,尤其是面向 AI Agent 场景时,同义词有助于自然语言理解。

维度元数据(当前无 SQL 层效果)

is_unique
is_unique
is_time
is_time
enum_values
enum_values
是面向上层 AI/元数据工具的声明性标注,可按语义如实填写(如时间维度标
is_time = true
is_time = true
、有限取值维度列出
enum_values
enum_values
)。它们会持久化并可通过
DESC EXTENDED
DESC EXTENDED
回读(
enum_values
enum_values
值保真;
is_unique
is_unique
/
is_time
is_time
只反映是否声明过,写了即回读
true
true
),但在 SQL 查询链路中不影响结果——不参与查询优化、不约束/校验取值(设了
enum_values
enum_values
后越界值照常返回)。不要依赖它们做数据校验或性能优化。详见能力与限制参考

注意外键类型匹配

外键列与被引用列的数据类型必须一致,否则创建时报错。如果两张表通过 string 列关联,被引用表的主键也应声明为该 string 列,而不是整数 ID:

-- 正确:dept(string)关联 dept_name(string) FOREIGN KEY (dept) REFERENCES depts (dept_name) -- 错误:dept(string)关联 dept_id(int),类型不匹配 FOREIGN KEY (dept) REFERENCES depts -- 默认引用主键 dept_id(int),报错

注意逻辑表定义顺序

TABLES
TABLES
子句中,被外键引用的表必须先定义:

TABLES ( depts AS ..., -- 先定义被引用表 emps AS ... FOREIGN KEY (dept) REFERENCES depts (dept_name) -- 再定义引用方 )

维护建议

用 DROP IF EXISTS 确保脚本幂等

DROP SEMANTIC VIEW IF EXISTS my_view; CREATE SEMANTIC VIEW my_view ...

修改结构用 CREATE OR REPLACE

ALTER SEMANTIC VIEW
ALTER SEMANTIC VIEW
支持
RENAME TO
RENAME TO
SET PROPERTIES
SET PROPERTIES
UNSET PROPERTIES
UNSET PROPERTIES
,但不支持增删维度或修改指标。要改结构,用
CREATE OR REPLACE SEMANTIC VIEW
CREATE OR REPLACE SEMANTIC VIEW
重放完整定义,无需先
DROP
DROP

-- 1. 用 SHOW CREATE SEMANTIC VIEW my_view 取回当前 DDL -- 2. 编辑后原子替换 CREATE OR REPLACE SEMANTIC VIEW my_view ...

查看当前 schema 下的语义视图

SHOW SEMANTIC VIEWS IN doc_test;

常见问题

Q:FOREIGN KEY 创建时报类型不匹配错误

检查外键列与引用列的数据类型是否一致。当引用列与主键列不同名时,需显式指定:

FOREIGN KEY (dept) REFERENCES depts (dept_name)

Q:DESC 视图返回空

语义视图没有普通列定义,

DESC
DESC
不带
EXTENDED
EXTENDED
返回空。需使用:

DESC EXTENDED my_view;

Q:

semantic_view()
semantic_view()
报 function not found

需要至少指定一个

DIMENSIONS
DIMENSIONS
METRICS
METRICS
参数,不能只传视图名:

-- 错误 SELECT * FROM semantic_view(my_view); -- 正确 SELECT * FROM semantic_view(my_view DIMENSIONS dim1 METRICS metric1);

Q:如何在语义视图查询中做过滤

semantic_view()
semantic_view()
括号内只接受
DIMENSIONS
DIMENSIONS
/
METRICS
METRICS
/
FACTS
FACTS
,不能直接传过滤条件。两种做法:用
FILTER (WHERE ...)
FILTER (WHERE ...)
定义条件聚合指标,或在
semantic_view()
semantic_view()
外层用
WHERE
WHERE
配合维度短名:

SELECT * FROM semantic_view(my_view DIMENSIONS city METRICS cnt) WHERE city = 'New York';

Q:ALTER SEMANTIC VIEW RENAME TO 报语法错误

新名称不能带 schema 前缀:

-- 错误 ALTER SEMANTIC VIEW my_view RENAME TO doc_test.new_view; -- 正确 ALTER SEMANTIC VIEW my_view RENAME TO new_view;

算术表达式指标与派生指标都可直接写在 METRICS 里

算术表达式指标(

MAX(col) - MIN(col)
MAX(col) - MIN(col)
SUM(col) / COUNT(col)
SUM(col) / COUNT(col)
等)单独查询和与其他指标混查都返回正确结果。同一逻辑表内还可引用其他已命名指标做运算:

METRICS ( emps.salary_range AS MAX(salary) - MIN(salary), -- 算术表达式指标 emps.total AS SUM(salary), emps.cnt AS COUNT(id), emps.avg_calc AS emps.total / emps.cnt -- 派生指标:引用命名指标 )

Q:如何在指标里使用窗口函数(占比、累计、排名)

窗口函数可以用于指标定义(

RANK()
RANK()
/
ROW_NUMBER()
ROW_NUMBER()
排名,或
SUM(SUM(...)) OVER (...)
SUM(SUM(...)) OVER (...)
做占比、累计)。要点:
PARTITION BY
PARTITION BY
/
ORDER BY
ORDER BY
必须引用维度的限定别名(如
orders.region
orders.region
),不能用物理列名或裸别名;只能引用指标同表的维度;查询时该维度须一并出现在
DIMENSIONS
DIMENSIONS
中。完整示例见创建语义视图的"带窗口函数指标的语义视图"。跨表的复合计算仍需放到
semantic_view()
semantic_view()
外层 SQL 完成。

相关文档

联系我们
预约咨询
微信咨询
电话咨询
邮件咨询