最佳实践

设计建议

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

一个语义视图应对应一个清晰的分析域,如"员工薪资分析"或"订单收入分析",而不是把所有表都塞进同一个视图。聚焦的视图更容易维护,查询性能也更好。建议从 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 场景时,同义词有助于自然语言理解。

合理设置维度元数据

  • is_unique = true
    is_unique = true
    :用于唯一标识类维度(如客户 ID、员工姓名),帮助查询引擎优化
  • is_time = true
    is_time = true
    :用于日期/时间类维度,支持时序分析工具正确识别
  • enum_values
    enum_values
    :用于取值有限的维度(如状态、分类),可约束取值范围并提升 AI 理解准确性

注意外键类型匹配

外键列与被引用列的数据类型必须一致,否则创建时报错。如果两张表通过 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 ...

修改结构需要重建

当前

ALTER SEMANTIC VIEW
ALTER SEMANTIC VIEW
只支持
RENAME TO
RENAME TO
,不支持增删维度或修改指标。修改视图结构的标准流程:

-- 1. 导出当前定义(可通过 DESC EXTENDED 或 MCP 工具 LH-desc-semantic-view) -- 2. 删除旧视图 DROP SEMANTIC VIEW IF EXISTS my_view; -- 3. 用修改后的定义重建 CREATE SEMANTIC VIEW my_view ...

通过 information_schema 监控视图状态

SELECT table_name, comment, create_time, last_modify_time FROM information_schema.tables WHERE table_schema = 'doc_test' AND table_type = 'SEMANTIC_VIEW' ORDER BY create_time DESC;

常见问题

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:FILTERS 子句定义的过滤器无法在查询中使用

FILTERS
FILTERS
中的命名过滤器是面向 AI/元数据层的语义注解,不能作为
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;

Q:指标定义了算术表达式(如 MAX - MIN),查询结果不对

算术表达式指标(

MAX(col) - MIN(col)
MAX(col) - MIN(col)
SUM(col) / COUNT(col)
SUM(col) / COUNT(col)
等)在创建时不报错,但查询时只返回第一个操作数的值,运算未被执行。这是当前版本的限制,请勿使用。

复合计算应在

semantic_view()
semantic_view()
查询的外层 SQL 中完成:

-- 不要在 METRICS 里写:emps.salary_range AS MAX(salary) - MIN(salary) -- 正确做法:在外层 SQL 计算 SELECT department, max_salary - min_salary AS salary_range FROM semantic_view( my_view, DIMENSIONS department, METRICS max_salary, METRICS min_salary );

Q:指标定义中引用其他指标(派生指标)报 cannot resolve column

不支持在指标定义中引用其他指标名称。

emps.avg AS emps.total / emps.count
emps.avg AS emps.total / emps.count
这类写法会在创建时报错。同样需要在外层 SQL 中计算。

Q:窗口函数指标查询时报 Compiler internal error

RANK() OVER (...)
RANK() OVER (...)
ROW_NUMBER() OVER (...)
ROW_NUMBER() OVER (...)
等窗口函数不能用于指标定义,创建不报错但查询时行为异常。请勿使用。

相关文档

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