数据血缘分析

更新时间:
复制 MD 格式

AnalyticDB for PostgreSQL支持从数据库审计日志中异步解析数据加工 SQL,并生成表级和字段级血缘关系。您可以在DataWorks 数据地图中查看数据的上下游关系。

使用说明

  • 数据血缘分析基于审计日志中的 SQL 文本进行静态解析,不解析 SQL 的实际执行计划,也不校验 SQL 是否执行成功、事务是否提交或数据是否实际写入。血缘结果不能作为 SQL 执行状态、执行次数或数据一致性的判断依据。

  • 本文采用白名单口径。仅本文明确列出的 SQL 形态属于支持范围;未列出的语法、对象类型和组合方式均不支持。

  • 开启该功能后,后台进程会持续读取并解析审计日志,因此会增加 Master 节点的 CPU 和内存消耗。业务越繁忙、审计日志产生越快,资源消耗通常越高。如需关闭血缘分析功能,请提交工单。

  • 在 DataWorks 中使用数据地图功能时,会自动启动AnalyticDB for PostgreSQL血缘分析功能,无需手动开启。

前提条件

使用数据血缘分析功能前,实例必须同时满足以下条件:

  • 实例为公共云AnalyticDB for PostgreSQL 6.0 版,且内核版本为 6.3.11.1 或以上版本。AnalyticDB for PostgreSQL 7.0 版实例不支持。

  • 实例不是 Serverless 模式。

  • 实例为公共云实例。

SQL 支持范围

数据血缘分析仅支持同时包含明确源表和目标表、且字段映射关系简单明确的数据加工 SQL。支持以下三类语句:

SQL 类型

支持的语句形态

表级血缘

字段级血缘

CREATE TABLE AS SELECT

CREATE TABLE ... AS SELECT ... FROM ...

支持

支持

SELECT INTO

SELECT ... INTO ... FROM ...

支持

支持

INSERT INTO SELECT

INSERT INTO ... (...) SELECT ... FROM ...

支持

支持

上述三类 SQL 还必须同时满足以下全部条件:

  • 单条 SQL 仅包含一个源表和一个目标表。

  • 表名和字段名使用未加双引号的小写标识符。

  • SELECT 列表必须显式列出字段,不支持 SELECT *table_name.*

  • 源字段与目标字段必须按照顺序一一对应。

  • 每个目标字段只能直接来源于一个源字段,不支持函数、运算、常量或其他表达式。

  • INSERT INTO SELECT 必须显式指定目标字段列表,且目标字段数量与 SELECT 字段数量相同。

  • SQL 中不能包含本文"不支持的 SQL 和查询结构"章节列出的任何结构。

支持示例

CREATE TABLE AS SELECT

CREATE TABLE target_table AS
SELECT id, name
FROM source_table;

生成的血缘包括:

  • 表级血缘:source_tabletarget_table

  • 字段级血缘:source_table.idtarget_table.id

  • 字段级血缘:source_table.nametarget_table.name

SELECT INTO

SELECT id, name
INTO target_table
FROM source_table;

生成的血缘包括:

  • 表级血缘:source_tabletarget_table

  • 字段级血缘:source_table.idtarget_table.id

  • 字段级血缘:source_table.nametarget_table.name

INSERT INTO SELECT

INSERT INTO target_table (id, name)
SELECT id, name
FROM source_table;

生成的血缘包括:

  • 表级血缘:source_tabletarget_table

  • 字段级血缘:source_table.idtarget_table.id

  • 字段级血缘:source_table.nametarget_table.name

不支持的 SQL 和查询结构

如果一条 SQL 包含以下任一语法、对象或场景,则整条 SQL 均不属于支持范围。即使系统偶尔生成了部分血缘,也不保证结果正确或完整。

类型

不支持的范围或示例

普通查询

不带 INTOSELECT,例如 SELECT id FROM sourcetable;

UPDATE

所有 UPDATE,包括带子查询的 UPDATE、行赋值子查询和 UPDATE ... FROM

其他 DML

INSERT ... VALUESINSERT ... DEFAULT VALUESDELETEMERGE

多表查询

JOIN、逗号连接、多源表查询、自连接

子查询

FROM 子查询、WHERE 子查询、标量子查询、相关子查询和嵌套子查询

CTE

WITH、递归 CTE

集合运算

UNIONUNION ALLINTERSECTEXCEPT

聚合和分组

聚合函数、GROUP BYHAVING

排序和结果修饰

DISTINCTORDER BYLIMITOFFSET、窗口函数

条件过滤

WHERE 子句

字段表达式

函数调用、算术运算、字符串拼接、CASE、类型转换、数组或行表达式

非直接字段映射

常量、一个源字段映射到多个目标字段、多个源字段计算后映射到一个目标字段

未显式指定目标字段

INSERT INTO targettable SELECT ...

DDL 和管理语句

不带查询子句的 CREATE TABLECREATE TABLE LIKEALTERDROPTRUNCATECOMMENTGRANT

视图

CREATE VIEWCREATE MATERIALIZED VIEW,以及以视图或物化视图作为源或目标的 SQL

特殊表类型

临时表、分区表、外部表及其他非普通持久表

跨 Schema 或跨库

public Schema、跨 Schema、跨数据库引用

特殊标识符

使用双引号、大小写敏感名称或无法唯一还原的对象名称

外部数据读写

COPY、外部加载、外部导出,以及文件、OSS 等外部介质与表之间的血缘

过程化或动态 SQL

存储过程、UDF、DO 块、动态 SQL、PREPAREEXECUTE

解释执行

EXPLAINEXPLAIN ANALYZE

复杂输入

一次提交多条 SQL、审计日志中被截断或无法完整还原的 SQL

其他使用限制

  • 异步展示:血缘由后台进程异步解析并上报,不保证实时生成。SQL 执行后,DataWorks 数据地图中的血缘展示可能存在延迟。

  • 不判断执行结果:解析器不判断 SQL 是否执行成功,也不判断事务是否提交。执行失败或最终回滚的 SQL 仍可能生成血缘,因此可能出现与实际数据写入情况不一致的结果。

  • 不补充隐含关系:系统仅解析 SQL 文本中直接出现的源表、目标表和字段映射,不推导分区父子关系、视图展开关系、函数内部关系或过程内部关系。

  • 不提供实时性和完整性 SLA:血缘结果用于辅助影响分析和数据理解,不应作为审计、计费、任务状态判断或数据一致性校验的唯一依据。