Apache Doris 中的 Data Trait:性能提速 2 倍的秘密武器

宝塔 Apache 部署 Node.js 项目:挂到子路径,不影响同机其他站点 阅读详情

在数据库系统的核心层,查询优化器如同一位精明的策略家,不断分析数据特征并制定最优执行计划。Apache Doris 作为一款高性能的 MPP 分析型数据库,其优化器内置的 Data Trait 分析机制,通过挖掘数据内在的统计特征和语义约束,为查询优化提供了基础设施。让我们一起来探索这个强大的功能!

什么是 Data Trait?

设想一下,如果你能提前知道数据的 “性格特征”,是不是就能更聪明地处理它们?Data Trait 正是这样一种对查询数据和中间结果的 “性格描述”。在 Doris 中,它目前实现了四种关键特征:

  1. 唯一性(Uniqueness):数据的 “身份证” “在这个世界上,我是独一无二的!”—— 当某列数据这样 “宣称” 时,它就具有唯一性特征。数学上表示为:NDV(不同值的数量) = 表的总行数。
  2. 均匀性(Uniformity):数据的 “复制粘贴” “我们全都一样!”—— 当一列数据都是相同值时,它就展现出均匀性。具体指非空不同值数量不超过 1。 有趣事实:这种列就像军队的制服,整齐划一,优化器看到它们可以采取特殊处理策略。
  3. 等值集(Equal Set):数据的 “双胞胎” “我们形影不离,永远相同!”—— 当两列数据在所有行中都完美匹配时(包括 NULL 值),它们就构成等值集。 Doris 的等值集判断是 NULL 敏感的,NULL ≠ NULL 哦!
  4. 函数依赖(Functional Dependency):数据的 “因果关系” “只要知道 X,就必然知道 Y!”—— 当一组列(X)能唯一决定另一组列(Y)的值时,就存在函数依赖。 X 称为决定因素(Determinant),Y 称为被决定因素(Dependecy) 定义如下: ∀X, Y ⊆ R, X → Y ⇔ ∀t1, t2 ∈ R, t1 [X] = t2 [X] ⇒ t1 [Y] = t2 [Y] 其中,t [X] 表示元组 t 在属性集 X 上的投影。

Data Trait 的表示

唯一性

唯一性使用 UniqueDescription 描述, 想象一个公司的员工管理系统:

  • 独立唯一性(slots):就像每个员工的工牌 ID(如 101、102),这些值在整个公司内是独一无二的
  • 联合唯一性(slotSets):例如 “部门 + 姓名” 的组合,单独看部门可能重复(多个研发部员工),单独看姓名也可能重复(同名员工),但 “研发部 + 张三” 的组合在全公司是唯一的

均匀性

均匀性使用 UniformDescription 描述, 包括:

  • 已知值的均匀列(有具体 value): 
    • 比如查询 WHERE department=' 研发部 ',这时 department 列在结果集中所有值都是 “研发部”
    • 类似 SELECT 1 as const_value 中的 const_value 列,所有行都是 1
  • 未知值的均匀列(无具体 value): 
    • 例如 LIMIT 1 后的所有列,虽然知道它们值相同,但不确定具体是什么值

等值集

等值集采用并查集(一种高效的数据结构)来管理,就像家族关系网:

每个数据列最初都是独立的 “个体”, 当发现两列值完全相同时(如存在谓词 a = b),它们就被划归到同一个家族,最终所有相等的列会形成一棵棵 “家族树”,树中的成员彼此等价。

函数依赖

函数依赖关系使用有向图实现, 就像公司汇报关系:

  • 节点:代表一组数据列(如员工 ID、部门 ID 等)
  • 边( → ):表示决定关系,比如: 
    • 员工 ID → 员工姓名(知道 ID 就能确定姓名)
    • 部门 ID + 项目 ID → 项目经理(联合决定)

这个关系网具有传递性:如果 A→B 且 B→C,那么 A→C

Data Trait 是如何推导出来的?

  1. 逐层调查:从查询计划的最底层开始,每个处理节点(如扫描、过滤、连接等)都会根据自身特点生成对应的数据特征报告
  2. 懒加载机制:只有当优化器真正需要这些特征时才会进行计算,避免不必要的分析工作
  3. 特征合成:高层节点会综合下层节点的特征信息,并结合自身操作特点,生成新的特征描述。 同时,Data Trait 之间也可以相互推导:具有 unique 属性的 slot 能决定所有其他 slot;具有 uniform 属性的 slot 依赖于所有其他的 slot;相等的 slot 互相依赖;相等的 slot 具有相同的 Unique 属性和 Uniform 属性。

Data Trait 的推导过程示例

CREATE TABLE employees (
    emp_id INT NOT NULL,
    emp_name VARCHAR(100),
    email VARCHAR(100),
    dept_id INT,
    salary DECIMAL(10,2),
    hire_date DATE
) UNIQUE KEY(emp_id) DISTRIBUTED BY HASH(emp_id) PROPERTIES('replication_num'='1');

SELECT dept_id, COUNT(*) AS emp_count FROM employees
GROUP BY dept_id;

以上面的 SQL 为例,说明一下 DATA TRAIT 的推导过程,查询计划如下:

[Aggregate]
   |
[Scan]
基表扫描层

当扫描 employees 表时,优化器发现:

  • 唯一标识:emp_id 是 UNIQUE KEY,具有唯一性特征
  • 函数依赖:由于 emp_id 是 UNIQUE KEY,它可以决定表中所有其他列的值(知道员工 ID 就能确定他的部门、姓名等信息)
聚合操作层

进行 GROUP BY 聚合时,数据特征发生了转变:

  • 唯一性变化 
    • 新增的特性:dept_id 是分组键,具有唯一性特征;
    • 丢失的特性:原本 emp_id 的唯一性不再有效,因为多行数据被折叠成了分组形式。
  • 函数依赖变化 
    • 新增的关系:现在 dept_id 成为新的 “决定因素”,可以确定该部门的员工数量 emp_count(就像知道部门编号就能查到该部门的人数统计)
    • 丢失的关系:原先基于 emp_id 的所有函数依赖都失效了,因为员工级别的信息已被聚合操作折叠。

Data Trait 如何优化查询?魔法般的规则应用

下面通过完整示例演示 Data Trait 如何在实际查询优化中发挥作用。先从建表开始,逐步展示优化器如何利用数据特征进行优化。

准备测试环境

建表语句和插入数据 SQL 如下:

-- 员工表(包含唯一ID)
DROP TABLE IF EXISTS employees;
CREATE TABLE employees (
    emp_id INT NOT NULL,
    emp_name VARCHAR(100),
    email VARCHAR(100),
    dept_id INT,
    salary DECIMAL(10,2),
    hire_date DATE
) UNIQUE KEY(emp_id) DISTRIBUTED BY HASH(emp_id) PROPERTIES('replication_num'='1');

-- 部门表(包含唯一ID)
DROP TABLE IF EXISTS departments;
CREATE TABLE departments (
    dept_id INT NOT NULL,
    dept_name VARCHAR(100),
    location VARCHAR(100)
) UNIQUE KEY(dept_id) DISTRIBUTED BY HASH(dept_id) PROPERTIES('replication_num'='1');

-- 订单表(包含唯一ID)
DROP TABLE IF EXISTS orders;
CREATE TABLE orders (
    order_id INT NOT NULL,
    customer_id INT,
    order_date DATE,
    amount DECIMAL(10,2)
) UNIQUE KEY(order_id) DISTRIBUTED BY HASH(order_id) PROPERTIES('replication_num'='1');


-- 插入测试数据
INSERT INTO departments SELECT number, concat('name',cast(number as string)), concat('location', cast(number as string)) from numbers("number"="30");

INSERT INTO employees SELECT number, concat('name',cast(number as string)), concat('email',cast(number as string)),number % 30, number, '2025-01-01' from numbers("number" = "100000000");

INSERT INTO orders VALUES
(1001, 5001, '2023-01-10', 999.99),
(1002, 5001, '2023-02-15', 1499.99),
(1003, 5002, '2023-01-20', 799.99),
(1004, 5003, '2023-03-05', 2499.99);

Data Trait 优化实战演示

根据连接键唯一性消除连接(ELIMINATE_JOIN_BY_UK)

场景:在进行 left join 时,右表的连接键是唯一的(允许存在多个 NULL 值),且查询只需要左表数据时...

魔法:直接去掉这个 Join!因为右表要么匹配一行,要么不匹配,不影响左表数据完整性。

示例如下:

-- 原始查询
SELECT COUNT(emp_id) FROM (
SELECT e.emp_id
FROM employees e
LEFT OUTER JOIN departments d ON e.dept_id = d.dept_id) t;

-- 优化后等效查询
SELECT COUNT(emp_id) FROM employees e;

关闭 ELIMINATE_JOIN_BY_UK 优化时(使用 set disable_nereids_rules = 'ELIMINATE_JOIN_BY_UK' 关闭优化),执行时间为 0.1sec, 在开启 ELIMINATE_JOIN_BY_UK 优化时,执行时间为 0.05sec,性能提升了 100%。

根据唯一性消除冗余聚合键(ELIMINATE_GROUP_BY)

场景: 当 Group By Key 列中存在具有 unique 并且非空属性的列时...

魔法:可以直接把 Group By 删除

--原始查询
SELECT COUNT(c2) FROM 
(SELECT emp_id c1, sum(salary) c2 from employees GROUP BY emp_id, emp_name) t;

-- 优化后等效查询
SELECT COUNT(c2) FROM 
(SELECT emp_id c1, salary c2 from employees) t;

在关闭 ELIMINATE_GROUP_BY 优化时,执行时间为 0.96sec, 在开启 ELIMINATE_GROUP_BY 优化时, SQL 的执行时间是 0.08sec, 性能提升了 1100%。

消除存在依赖关系的聚合键(ELIMINATE_GROUP_BY_KEY)

场景:Group By 多列,并且这些列中具有函数依赖关系

魔法:使用函数依赖中被决定的 slot 可以在 Group By Key 列中被消除。

示例如下:

--案例1: 根据函数提供的函数依赖消除
-- email -> SUBSTR(email, 1, INSTR(email, '@')-1)
-- 原始查询
SELECT count(email) FROM (SELECT email
FROM employees
GROUP BY email, SUBSTR(email, INSTR(email, 'l')+1)) t;
-- 优化后等效查询
SELECT count(email) FROM (SELECT email
FROM employees
GROUP BY email) t;

--案例2: 根据等值集提供的函数依赖消除
-- 原始查询
SELECT COUNT(*) 
FROM employees e 
INNER JOIN departments d ON e.dept_id = d.dept_id 
GROUP BY e.dept_id, d.dept_id;
-- 优化后等效查询
SELECT COUNT(*) 
FROM employees e 
INNER JOIN departments d ON e.dept_id = d.dept_id 
GROUP BY e.dept_id;

以案例 1 为例,在关闭 ELIMINATE_GROUP_BY_KEY 优化时,执行时间为 2.11s, 在开启 ELIMINATE_GROUP_BY_KEY 优化时,SQL 的执行时间为 1.41sec, 性能提升了 50%。

消除均一列的聚合键(ELIMINATE_GROUP_BY_KEY_BY_UNIFORM)

场景:Group By 的列所有值都相同...

魔法:直接去掉 Group By,因为所有行都属于同一组。

示例如下:

-- 原始查询
SELECT hire_date, max(salary) FROM employees WHERE hire_date='2025-01-01' GROUP BY dept_id,hire_date;

-- 优化后等效查询
SELECT '2025-01-01', max(salary) FROM employees WHERE hire_date='2025-01-01' GROUP BY dept_id;

在关闭 ELIMINATE_GROUP_BY_KEY_BY_UNIFORM 优化时,执行时间为 0.15sec,在开启 ELIMINATE_GROUP_BY_KEY_BY_UNIFORM 优化时,SQL 的执行时间是 0.11sec,性能提升了 36%。

消除无意义排序(ELIMINATE_ORDER_BY_KEY)

场景:按唯一键排序, 或者排序键中包含具有函数依赖时。

魔法:去掉这个 Order By,因为数据已经自然有序, 去掉函数依赖中被决定的 Key。

示例如下:

-- 案例1:唯一性推导的函数依赖简化
SELECT sum(c1) FROM
(SELECT emp_id c1, emp_name c2
FROM employees
ORDER BY emp_id,emp_name,email,dept_id,salary,hire_date
LIMIT 1000000) t;
-- 优化后等效查询
SELECT sum(c1) FROM
(SELECT emp_id c1, emp_name c2
FROM employees
ORDER BY emp_id
LIMIT 1000000) t;

-- 案例2:表达式推导的函数依赖简化
SELECT hire_date, EXTRACT(YEAR FROM hire_date), EXTRACT(MONTH FROM hire_date)
FROM employees
ORDER BY hire_date, EXTRACT(YEAR FROM hire_date), EXTRACT(MONTH FROM hire_date);
-- 优化后等效查询
SELECT hire_date, EXTRACT(YEAR FROM hire_date), EXTRACT(MONTH FROM hire_date)
FROM employees
ORDER BY hire_date;

-- 案例3: 多列表达式依赖简化
SELECT emp_name
FROM employees 
ORDER BY emp_name, email, CONCAT(emp_name, ' ', email);
-- 优化后等效查询
SELECT emp_name
FROM employees 
ORDER BY emp_name, email;

-- 案例4: 根据均匀性消除
SELECT emp_name 
FROM employees 
WHERE emp_id = 101 
ORDER BY emp_id;
--优化后等效查询
SELECT emp_name 
FROM employees 
WHERE emp_id = 101;

以案例 1 为例,在关闭 ELIMINATE_ORDER_BY_KEY 优化时,SQL 的执行时间是 0.37sec, 在开启 ELIMINATE_ORDER_BY_KEY 优化时,SQL 的执行时间是 0.13sec,性能提升了 185%。

优化效果对比

五个优化规则的效果对比如下图所示,蓝色代表关闭优化规则的 SQL 执行时间,橙色代表开启优化规则的 SQL 执行时间。

优化效果对比.png

最佳实践

建议做法:为所有唯一键列添加明确的 UNIQUE 约束

无论列是否为主键,只要具有唯一性特征(包括业务唯一键、组合唯一键和外键关联列),都应通过 UNIQUE 约束明确定义。

CREATE TABLE orders (
    order_id INT,
    order_code VARCHAR(20));
ALTER TABLE orders ADD CONSTRAINT orders_uk UNIQUE (order_id);

优化收益:帮助优化器识别唯一性特征,实现 Join 消除、Group By 简化等优化。

建议做法:合理使用 NOT NULL 约束

对业务上不允许为空的列添加 NOT NULL,因为上面提到的一些优化规则,是要求 slot 唯一且非空或者均匀且非空才能应用, 添加 NOT NULL 可以避免 NULL 值对优化的干扰。

CREATE TABLE products (
    product_id INT NOT NULL,
    product_name VARCHAR(100) NOT NULL);

避免做法:过度使用 SELECT *

-- 应避免的写法
explain logical plan
SELECT * 
FROM employees e
LEFT OUTER JOIN departments d ON e.dept_id = d.dept_id;

-- 推荐写法
explain logical plan
SELECT e.* 
FROM employees e
LEFT OUTER JOIN departments d ON e.dept_id = d.dept_id;

问题原因:例如,优化规则 ELIMINATE_JOIN_BY_UK 能够应用的条件之一是投影列中只出现 LEFT OUTER JOIN 左表的列, 所以当您只需要左表数据时,SELECT * 的使用会阻碍优化器应用优化规则。

避免做法:避免冗余的分组键和排序键

-- 冗余分组列(即使用者知道product_id决定product_name,但是数据库系统未识别此依赖,此时product_name为冗余,可以删除)
SELECT product_id, product_name
FROM products
GROUP BY product_id, product_name;

通过主动避免冗余的分组键和排序键,即使某些函数依赖无法被系统自动识别,您仍然可以提高查询执行效率, 减少资源消耗, 保持代码简洁性。

总结和展望

Data Trait 通过四大核心特征(唯一性、均匀性、等值集、函数依赖)为查询优化器提供了深度的数据认知能力:

  • 数据特征识别:精确捕捉数据的本质属性,如主键唯一性、常量列均匀性等
  • 查询语义理解:解析 SQL 操作背后的真实数据关系,识别冗余操作
  • 优化决策支持:为查询重写、计划选择等优化提供理论依据

Data Trait 的设计采用了高度模块化的架构,为未来的功能扩展预留了充分空间。特别是在 Uniform 特征的扩展方面,计划引入更精细化的取值分布描述能力。当前 Uniform 主要记录列值完全均匀(单一值)的情况,下一步将扩展为支持记录有限离散值的场景。例如当查询包含 WHERE status IN ('active','pending')这样的 IN 谓词过滤时,优化器可以精确获知 status 列在此查询上下文中只有 2 个可能的取值。这种扩展后的 Uniform 特征将为优化器带来更丰富的决策依据。

【深大算法设计与分析】实验六 最大流应用问题(棒球赛问题) 实验报告 附代码、数据集 【内附代码与数据集】【深大算法设计与分析】实验六 最大流应用问题(棒球赛问题) 阅读详情

相关推荐

Mac用户解决WPS中的俄语显示红线问题(WPS添加外语拼写检查)

我所使用的WPS版本:AppleStore 下载的 MacOs版 3.3.0 首先,对于 在访达-应用程序中,找到WPS,右键-点击“显示包内容” 然后按照下图的索引目录(Contents\Resource\office6\dicts\spellcheck),最后进入一个叫“spellcheck”的文件夹 最后将下载好的字典包(例如上图中的 en_US就代表美式英语;ru_RU就代表俄语) 关于字典包资源下载,我在网上找到一个Google云盘,里面包含了法语,德语,西语,意大利语,葡萄牙.

qq_48159150的博客 7893

Apache Doris INSERT INTO 终极指南:SQL方式高效数据导入的10个技巧

Apache Doris INSERT INTO 是数据仓库中最核心的数据导入方式之一,通过标准的SQL语法实现高效数据加载。作为统一分析数据库,Doris提供了多种数据导入方案,其中INSERT INTO以其简单易用和强大的功能受到开发者青睐。 ## 🚀 为什么选择INSERT INTO导入数据? INSERT INTO语句是传统SQL用户最熟悉的数据操作方式,在Doris中它不仅保持了标

gitblog_00199的博客 535

Gazebo仿真UUV水下机器人:从环境搭建到避障算法实战

本文详细介绍了使用Gazebo仿真平台进行UUV水下机器人开发的全流程,涵盖从环境搭建、uuv_simulator配置、传感器集成到核心避障算法实战。通过搭建水下仿真实验室并实现基于激光雷达数据的反应式避障算法,为水下机器人算法验证与开发提供了高效、低成本的解决方案。

weixin_28840591的博客 263

Apache Flink 零基础

低代码、易开发、易维护、可读性强,适配实时数仓分层、指标统计、数据清洗、多源数据关联等绝大多数业务场景,支持Kafka、Doris、MySQL、Hive等主流组件读写,是企业实时开发主流方案。:接收客户端提交的实时/离线任务、解析任务逻辑、生成DAG执行流程图、分配集群资源、调度任务运行、管理Checkpoint/Savepoint、处理任务故障重启、协调集群节点状态。手动触发的状态快照,主要用于任务升级、代码迭代、版本更新、集群迁移、任务重启等运维操作,保证业务无感知、数据不错乱、任务无缝恢复。

2402_85354210的博客 314

4D 毫米波雷达:智驾普及的新路径(一)

总体而言,4D 毫米波雷达具有更佳的探测能力,更高的分辨率和精度,在人工智能技术的加持下,能够实现更加智能化的感知和跟踪,从而为自动驾驶、智能交通等领域提供更加可靠的数据支持。博世的第五代引入了俯仰维度,但其角度分辨率较差,且最大探测距离为。车载毫米波雷达的尺寸受限,我们认为通过算法的优化、天线内置等方式可以在保障性能的前提下,压缩尺寸,便于车企进行灵活的设计安装。在物理设计、天线性能设计、电连接、封装工艺和材料、散热处理、可靠性与自动化测试等方面进行持续优化,推出可大规模量产的高性能毫米波雷达解决方案。

奔袭的算法工程师 3954

libcrypto.so.10(OPENSSL_1.0.2)(64bit) is needed by erlang-22.0.7-1.el7.x86_64

今天安装Rabbitmq的 erlang-22.0.7-1.el7.x86_64.rpmrpm包时遇到了这个坑,害找到说是不容易;错误信息在下面; [root@iz2zef7u84js1qeeq00ewwz RabbitMQ]# rpm -ivh erlang-22.0.7-1.el7.x86_64.rpm warning: erlang-22.0.7-1.el7.x86_64.rpm: Header V4 RSA/SHA1 Signature, key ID 6026dfca: NOKEY error:

qq_45782349的博客 5782

深入 Apache Hudi Write Operations:一次 Upsert 到底经历了什么?

Apache Hudi Write Operations

喻师傅的学习笔记 665

QMT中ContextInfo的使用注意

QMT中ContextInfo下声明的全局变量的使用注意事项

路在何方 2806

每天认识一个组件:Apache Flink

Flink 的核心价值不只是“实时”,而是把持续数据流、事件时间、业务状态和一致恢复放入同一个分布式运行时中。对于实时指标、持续 ETL、CDC、欺诈检测和事件驱动应用,它提供了一套比“消息队列加手工状态管理”更完整的计算模型。

weixin_47983718的博客 623

异步FIFO的隐形陷阱:复位信号同步化实战解析

本文深入解析异步FIFO设计中复位信号同步化的隐形陷阱,重点分析赛灵思xpm_fifo_async原语在FPGA应用中的常见问题。通过实战代码和系统集成方案,提供复位同步化的最佳实践,帮助工程师避免跨时钟域通信故障,提升系统可靠性。

keras9composer的博客 244

跨平台CMake AutoSAR

AutoSAR是汽车行业采用的一种软件架构标准,它旨在提供一个通用的软件平台,使得汽车软件的开发和集成变得更加高效和灵活。总结一下,CMake AutoSAR是一个强大的跨平台工具,为AutoSAR开发提供了便利。通过简单的配置文件和命令,开发人员可以实现高效、灵活的跨平台开发,并加快自动驾驶系统的开发进程。上述示例中,我们定义了一个名为AutoSAR的项目,指定了源代码文件的路径和依赖库的路径。通过简单的配置文件和命令,开发人员可以实现高效、灵活的跨平台开发,并加快自动驾驶系统的开发进程。

EcmFsharp的博客 232

Apache Doris 与 SelectDB 是什么关系?从开源技术到面向 Agent 的极速分析数据库

Apache Doris 与 SelectDB 是什么关系?了解二者的开源技术渊源,以及 SelectDB Cloud、Enterprise、阿里云瑶池数据库 SelectDB、信创适配与面向 Agent 的极速分析数据库能力。

SelectDB 485

OpenHarmony Stage模型深度解剖:从Ability Kit到沙箱隔离的全链路底层原理

基于微内核架构,提供进程管理、内存管理、IPC通信等基础能力:包含V8引擎、ArkTS运行时、渲染引擎等核心组件:Ability Kit框架,提供应用生命周期管理、组件调度等能力:基于Stage模型的应用程序。

m0_67505153的博客 191

每天认识一个组件:Apache StreamPark

StreamPark 解决的核心问题,不是如何执行流计算,而是如何让流处理应用以统一、可管理的方式进入生产环境,它把 Flink 应用开发与运维中的重复工作收拢到统一控制面。

weixin_47983718的博客 478

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

WPS/Office Word客户端设置文档打开密码,Apache POI 解密—— 原理、实现与踩坑实录

本文介绍基于Apache POI 5.4.1实现的DocxDecryptor工具类,解决金融文档解析中加密docx的打开密码问题。核心原理:通过文件头判断是否为OLE2加密容器,仅支持ECMA-376标准的standard/agile加密模式,拒绝非标加密。关键在于verifyPassword()与getDataStream()必须使用同一Decryptor实例,否则解密失败。实录三大踩坑点:流需支持mark(用BufferedInputStream)、Decryptor不可复用、解密流仅可读一次。提供清晰

学习/总结 403

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Apache Flink 2.3.0(最新版本)

Flink是一个用于无界与有界数据流的有状态分布式处理引擎,具备内存级执行速度和弹性扩展能力。其核心特性包括“边来边算”的无界流处理、统一批流处理的有界流模型,以及高效的状态管理。Flink起源于柏林的Stratosphere研究项目,2014年成为Apache顶级项目,阿里巴巴的Blink分支在SQL性能与支持方面贡献显著,推动了Flink SQL的发展。Flink 2.0引入存算分离、物化表等重大更新。学习者可通过官方文档、安装包(如阿里云镜像站)获取资源,掌握从架构到部署的全链路知识。

super_mochi1 307

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Apache Doris 基础

需根据业务数据特征精准选择,选错模型会导致数据错误、查询性能极差。

2402_85354210的博客 339

Apache Spark4.1.3 一键部署与卸载脚本

本文介绍了一套基于三台主机(node11/node12/node13)的Spark 4.1.3集群一键部署与卸载方案。在已配置主机名、SSH免密、JDK17及Hadoop 3.5.0的前提下,通过spark_deploy.sh脚本自动完成Scala 2.13.16与Spark的安装、配置分发、集群启动及进程验证。脚本支持重复执行,避免配置重复。配套的spark_uninstall.sh可安全卸载Spark与Scala,保留JDK和Hadoop环境。整个过程自动化程度高,适用于教学与生产环境快速搭建与清理。

super_mochi1 98

Apache Doris 异步物化视图与 Snowflake MV / Dynamic Tables 工程化对照

在面向分析的数据分层建模里,物化视图是降低重复计算、缩短查询响应时间的通用手段。的异步物化视图从 2.1 版本引入、3.0 版本完善,以一套机制覆盖了多表 join、嵌套分层、分区增量刷新与构建资源管控;Snowflake 则把单表加速与多表管道拆成两套独立机制——Materialized Views 与 Dynamic Tables,前者有严格的单表与聚合限制,后者以 TARGET_LAG 声明数据新鲜度。

SelectDB 279

Apache Doris 企业版怎么选?SelectDB 提供同源商业支持、私有化部署与信创适配

Apache Doris 企业版怎么选?了解 SelectDB 与 Doris 的同源关系、企业级商业支持、私有化部署、信创国产化适配,以及阿里云、华为云、腾讯云、AWS 云平台部署方案。

SelectDB 363

每天认识一个组件:Apache Pulsar

Apache Pulsar 的核心价值在于:它不是把消息系统简单做大,而是以分层架构、多租户模型和跨集群能力,把消息、事件流、实时管道和数据平台治理放在同一个系统框架下。Pulsar 更适合有平台化诉求的团队:多业务共享、实时数据流、跨地域容灾、海量 Topic、长期留存、轻量流处理和连接器生态。

weixin_47983718的博客 607

Apache Superset 重要特性详解(三):语义层 / 权限 / 缓存 / 嵌入的实战最佳实践(2026 版)

本文详解 Apache Superset 的四大核心生产实践:语义层建模(统一口径,指标唯一定义)、行级安全(RLS)(基于角色动态过滤数据)、缓存调优(配置 Redis 与 TTL 策略提升性能)、仪表盘嵌入(通过 guest token 实现系统集成)。结合决策图、命名规范与安全最佳实践,提供可直接复制的配置模板,助力企业构建可复用、安全、高性能的数据分析平台。

weixin_43128865的博客 522

Apache Superset 架构深度解析(二):一次查询从点击到渲染的完整旅程(附架构图 + 时序图)

当用户在Superset中点击图表,一次查询从请求到渲染历经多层协作:浏览器发起请求后,Gunicorn通过RBAC与RLS鉴权,并从PostgreSQL读取元数据;若缓存命中则直接返回结果,否则由QueryContext结合db_engine_spec生成SQL,经SQLAlchemy执行并写入缓存。大查询走Celery异步路径,结果通过Redis Streams推送至WebSocket通知前端。整个过程依赖五级缓存(含筛选、表单、结果集等),生产环境需配Redis实现高性能与高可用。

weixin_43128865的博客 501

存算分离冷查询提速 7.5 倍!Apache Doris 4.2 Peer Read 实现跨计算组缓存复用

Apache Doris 4.2 引入 Peer Read 机制,实现存算分离架构下跨计算组缓存复用,解决冷查询延迟高、扩缩容后缓存失效等问题。实测主键点查冷查询提速约 7.5 倍,P99 延迟降低约 80%,对象存储请求减少约 98%,全面解析工作原理、性能测试与配置方法。

SelectDB 434

6 款电商 AI 图片生成软件实测|国内 + 跨境卖家工具清单

电商 AI 作图工具已经从 "能不能用" 进入了 "好不好用" 的阶段。对于绝大多数卖家而言,现在的 AI 工具已经可以覆盖 60%-80% 的基础商品图需求,显著降低拍摄和设计成本。选择工具的核心逻辑不是 "哪款最强",而是 "哪款最适配你的品类、平台规模和团队能力"。垂直电商工具胜在工作流效率,通用生图工具强在创意上限,模板类工具赢在上手速度。建议根据自身业务阶段,搭配 1-2 款主力工具 + 1 款辅助工具,形成适合自己的视觉生产流程。

Mardi_Ladin的博客 321

视频隐私脱敏工程化:CSRT/KCF追踪算法在本地推理中的实现与边界

在短视频内容合规审查中,动态遮挡(Dynamic Masking)是高频且高耗时的环节。传统手动关键帧打码不仅效率低下,且在目标快速移动或遮挡时极易出现遮罩漂移。本文从计算机视觉工程角度,解析基于CSRT与KCF算法的目标追踪方案在视频隐私处理中的技术路径、性能权衡及落地实践。

Mysssone的博客 167
上一篇: 更高效的数据处理解决方案:基于 MinIO 部署 Apache Doris 存算分离版本实践
下一篇: 字节跳动:Apache Doris + AI 一站式融合数据引擎的探索与实践
SelectDB技术团队
博客等级 码龄4年 2119粉丝 484原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SelectDB技术团队

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值