Databend 产品月报(2025年2月)

很高兴为您带来 Databend 2025 年 2 月的最新更新、新功能和改进!我们希望这些增强功能对您有所帮助,并期待您的反馈。

从 MySQL 迁移到 Databend

Databend 推荐使用 db-archiver 进行 MySQL 批量迁移,使用 Flink CDC 进行实时变更数据捕获(CDC)迁移。教程已更新:

设置会话标签

现在,您可以为会话分配一个可选标签,从而更方便地在日志表中过滤具有指定标签的日志。例如,以下命令将当前会话的标签设置为 eric

ini 复制代码
SET SESSION query_tag = 'eric';

随后,我们执行一个查询,并使用该标签从日志表中检索相应的日志记录:

ini 复制代码
SHOW USERS;

SELECT query_tag, query_text 
FROM system.query_log 
WHERE query_tag = 'eric' 
LIMIT 1;

返回结果中,您可以找到带有 eric 标签的查询记录:

sql 复制代码
-[ RECORD 1 ]-----------------------------------
               query_tag: eric
              query_text: SHOW USERS

溢出数据存储

自托管 Databend 支持在内存使用超出可用限制时,将中间查询结果溢出到磁盘。现在,您可以配置溢出数据的存储位置,可选择本地磁盘存储或远程 S3 兼容存储桶。

以下示例将 Databend 配置为最多使用 1 TB 本地磁盘空间进行溢出操作,同时保留 40% 磁盘空间供系统使用:

ini 复制代码
[spill]
spill_local_disk_path = "/data1/databend/databend_spill"
spill_local_disk_reserved_space_percentage = 40
spill_local_disk_max_bytes = 1099511627776

以下示例将 Databend 配置为使用 MinIO 作为 S3 兼容存储服务来进行溢出操作:

ini 复制代码
[spill]
[spill.storage]
type = "s3"
[spill.storage.s3]
bucket = "databend"
root = "admin"
endpoint_url = "http://127.0.0.1:9900"
access_key_id = "minioadmin"
secret_access_key = "minioadmin"
allow_insecure = true

使用 "FROM table" 获取所有列

Databend 扩展了 SQL 语法,允许查询直接以 FROM <table> 开头,而无需显式使用 SELECT *

css 复制代码
FROM my_table;

等同于:

sql 复制代码
SELECT * FROM my_table;

新增与优化的 SQL 命令

  • ATTACH TABLE:现在,您可以在附加表时指定选择的列。
ini 复制代码
ATTACH TABLE population_only (city, population) 's3://databend-doc/1/16/' CONNECTION = (
  REGION='us-east-2',
  AWS_KEY_ID = '<your_aws_key_id>',
  AWS_SECRET_KEY = '<your_aws_secret_key>'
);

新教程:使用 ATTACH TABLE 链接表

  • DESC PROCEDURE:显示特定存储过程的详细信息。
sql 复制代码
DESC PROCEDURE sum_even_numbers(Uint8, Uint8);

┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│  Property │                                                                                        Value                                                                                       │
├───────────┼────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ signature │ (start_val,end_val)                                                                                                                                                                │
│ returns   │ (UInt8)                                                                                                                                                                            │
│ language  │ SQL                                                                                                                                                                                │
│ body      │ BEGIN\n    LET sum := 0;\n    FOR i IN start_val TO end_val DO\n        IF i % 2 = 0 THEN\n            sum := sum + i;\n        END IF;\n    END FOR;\n    \n    RETURN sum;\nEND; │
└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘

新增与优化的 SQL 函数

  • TIMESTAMP_DIFF:计算两个时间戳之间的差异,并将结果以 INTERVAL 格式返回。
sql 复制代码
SELECT TIMESTAMP_DIFF('2025-02-01'::TIMESTAMP, '2025-01-01'::TIMESTAMP);

┌──────────────────────────────────────────────────────────────────┐
│ timestamp_diff('2025-02-01'::TIMESTAMP, '2025-01-01'::TIMESTAMP) │
├──────────────────────────────────────────────────────────────────┤
│ 744:00:00                                                        │
└──────────────────────────────────────────────────────────────────┘
  • FUSE_TIME_TRAVEL_SIZE:计算表的历史数据(用于时间旅行)的存储大小。
sql 复制代码
-- Calculate historical data size for all tables in all databases
SELECT ...
FROM fuse_time_travel_size();

-- Calculate historical data size for all tables in a specified database
SELECT ...
FROM fuse_time_travel_size('<database_name>');

-- Calculate historical data size for a specified table in a specified database
SELECT ...
FROM fuse_time_travel_size('<database_name>', '<table_name>'));
  • ARRAYS_ZIP:将多个数组合并为一个数组元组。
css 复制代码
SELECT ARRAYS_ZIP([1, 2, 3], ['a', 'b', 'c']);

┌────────────────────────────────────────┐
│ arrays_zip([1, 2, 3], ['a', 'b', 'c']) │
├────────────────────────────────────────┤
│ [(1,'a'),(2,'b'),(3,'c')]              │
└────────────────────────────────────────┘
  • MAP_INSERT:返回一个新的 MAP,其中包含输入 MAP 和插入的新键值对(如果键已存在,则更新为新值)。
css 复制代码
SELECT MAP_INSERT({'a':1,'b':2,'c':3}, 'd', 4);

┌─────────────────────────────────────────┐
│ map_insert({'a':1,'b':2,'c':3}, 'd', 4) │
├─────────────────────────────────────────┤
│ {'a':1,'b':2,'c':3,'d':4}               │
└─────────────────────────────────────────┘


SELECT MAP_INSERT({'a':1,'b':2,'c':3}, 'a', 5, true);

┌───────────────────────────────────────────────┐
│ map_insert({'a':1,'b':2,'c':3}, 'a', 5, TRUE) │
├───────────────────────────────────────────────┤
│ {'a':5,'b':2,'c':3}                           │
└───────────────────────────────────────────────┘
  • MAP_PICK:返回一个新的 MAP,包含来自现有 MAP 的指定键值对。
css 复制代码
SELECT MAP_PICK({'a':1,'b':2,'c':3}, 'a', 'c');

┌─────────────────────────────────────────┐
│ map_pick({'a':1,'b':2,'c':3}, 'a', 'c') │
├─────────────────────────────────────────┤
│ {'a':1,'c':3}                           │
└─────────────────────────────────────────┘

SELECT MAP_PICK({'a':1,'b':2,'c':3}, ['a', 'b']);

┌───────────────────────────────────────────┐
│ map_pick({'a':1,'b':2,'c':3}, ['a', 'b']) │
├───────────────────────────────────────────┤
│ {'a':1,'b':2}                             │
└───────────────────────────────────────────┘
  • EXTRACT:现在,您可以从间隔值中提取组件,并新增对 EPOCH 作为可提取字段的支持。
scss 复制代码
SELECT NOW(), EXTRACT(DAY FROM NOW()), EXTRACT(DOY FROM NOW()), EXTRACT(EPOCH FROM NOW());

┌────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│            now()           │ EXTRACT(DAY FROM now()) │ EXTRACT(DOY FROM now()) │ EXTRACT(EPOCH FROM now()) │
├────────────────────────────┼─────────────────────────┼─────────────────────────┼───────────────────────────┤
│ 2025-02-08 03:51:51.991167 │                       8 │                      39 │         1738986711.991167 │
└────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
sql 复制代码
SELECT EXTRACT(DAY FROM '1 day 2 hours 3 minutes 4 seconds'::INTERVAL);

┌─────────────────────────────────────────────────────────────────┐
│ EXTRACT(DAY FROM '1 day 2 hours 3 minutes 4 seconds'::INTERVAL) │
├─────────────────────────────────────────────────────────────────┤
│                                                               1 │
└─────────────────────────────────────────────────────────────────┘
  • SUM:现在支持 INTERVAL 值。
sql 复制代码
-- Create a table with integer, double, and interval columns
CREATE TABLE sum_example (
    id INT,
    int_col INTEGER,
    double_col DOUBLE,
    interval_col INTERVAL
);

-- Insert data
INSERT INTO sum_example VALUES 
(1, 10, 15.5, INTERVAL '2 days'),
(2, 20, 25.7, INTERVAL '3 days'),
(3, NULL, 5.2, INTERVAL '1 day'),  
(4, 30, 40.1, INTERVAL '4 days');

-- Calculate the sum for each column
SELECT 
    SUM(int_col) AS total_integer,
    SUM(double_col) AS total_double,
    SUM(interval_col) AS total_interval
FROM sum_example;

-- NULL values are ignored.
-- SUM(interval_col) returns 240:00:00 (10 days).

┌──────────────────────────────────────────────────────────┐
│  total_integer  │    total_double   │   total_interval   │
├─────────────────┼───────────────────┼────────────────────┤
│              60 │              86.5 │ 240:00:00          │
└──────────────────────────────────────────────────────────┘
  • DATE_TRUNC:现在支持 WEEK 作为精度。
less 复制代码
SELECT
    DATE_TRUNC(MONTH, to_date('2022-07-07')),
    DATE_TRUNC(WEEK, to_date('2022-07-07'));

┌────────────────────────────────────────────────────────────────────────────────────┐
│ DATE_TRUNC(MONTH, to_date('2022-07-07')) │ DATE_TRUNC(WEEK, to_date('2022-07-07')) │
├──────────────────────────────────────────┼─────────────────────────────────────────┤
│ 2022-07-01                               │ 2022-07-04                              │
└────────────────────────────────────────────────────────────────────────────────────┘

关于 Databend

Databend 是一款开源、弹性、低成本,基于对象存储也可以做实时分析的新式湖仓。期待您的关注,一起探索云原生数仓解决方案,打造新一代开源 Data Cloud。

👨‍💻‍ Databend Cloud:databend.cn

📖 Databend 文档:docs.databend.com

💻 Wechat:Databend

✨ GitHub:github.com/databendlab...

相关推荐
YMatrix 官方技术社区20 小时前
YMatrix 存储引擎解密:MARS3 存储引擎如何超越传统行存、列存实现“时序+分析“场景性能大幅提升?
开发语言·数据库·时序数据库·数据库架构·智慧工厂·存储引擎·ymatrix
辞砚技术录20 小时前
MySQL面试题——索引2nd
数据库·mysql·面试
linweidong21 小时前
C++thread pool(线程池)设计应关注哪些扩展性问题?
java·数据库·c++
欧亚学术1 天前
突发!刚刚新增17本期刊被剔除!
数据库·论文·sci·期刊·博士·scopus·发表
黑白极客1 天前
怎么给字符串字段加索引?日志系统 一条更新语句是怎么执行的
java·数据库·sql·mysql·引擎
大厂技术总监下海1 天前
数据湖加速、实时数仓、统一查询层:Apache Doris 如何成为现代数据架构的“高性能中枢”?
大数据·数据库·算法·apache
LeenixP1 天前
RK3576-Debian12删除userdata分区
linux·运维·服务器·数据库·debian·开发板
知行合一。。。1 天前
Python--03--函数入门
android·数据库·python
X***07881 天前
理解 MySQL 的索引设计逻辑:从数据结构到实际查询性能的系统分析
数据库·mysql·sqlite
爬山算法1 天前
Hibernate(31)Hibernate的原生SQL查询是什么?
数据库·sql·hibernate