有哪些线上doris优化方面的经验可以分享下吗?

提问者:帅平 问题分类:数据库
有哪些线上doris优化方面的经验可以分享下吗?
13 个回答
冷心丿玫瑰
冷心丿玫瑰
利用workload group实现资源隔离,提升集群资源利用率,示例如下:
-- 创建资源组
CREATE WORKLOAD GROUP "analytics"
PROPERTIES (
    "cpu_limit" = "50%",
    "memory_limit" = "30%",
    "concurrency_limit" = "10"
);
-- 创建资源组
CREATE WORKLOAD GROUP "etl"
PROPERTIES (
    "cpu_limit" = "30%",
    "memory_limit" = "50%",
    "concurrency_limit" = "5"
);
-- 将用户绑定到资源组
CREATEUSER'analyst'@'%' IDENTIFIED BY'password'
PROPERTIES ("workload_group" = "analytics");
CREATEUSER'etl_user'@'%' IDENTIFIED BY'password'
PROPERTIES ("workload_group" = "etl");
发布于:2天前 IP属地:四川省
午后的阳光让人昏沉
午后的阳光让人昏沉
这里可以结合查询优先级进行管理,示例如下:
-- 设置查询优先级
SET QUERY_PRIORITY = 'HIGH';
-- 在资源组中配置优先级
ALTER WORKLOAD GROUP "analytics"
SET PROPERTIES ("query_priority" = "HIGH");
发布于:2天前 IP属地:四川省
我是蓝天i
我是蓝天i
利用ToN的查询进行提前终止和堆排序优化,示例如下:
-- 启用 TopN 优化
SET enable_topn_opt = true;
-- 调整 TopN 缓存大小
SET topn_cache_size = 1024;
-- 传统方式(全排序后取前N)
SELECT * FROM orders ORDER BY amount DESC LIMIT 10;
-- 优化方式(使用 TopN 算子)
EXPLAIN 
SELECT * FROM orders ORDER BY amount DESC LIMIT 10;
发布于:2天前 IP属地:四川省
你我这辈子最的依靠
你我这辈子最的依靠
利用行缓存提高查询效率,配置如下:
-- 启用行缓存
SET enable_row_cache = true;
-- 调整行缓存大小(默认 2MB)
SET row_cache_mem_limit = "50MB";
-- 查看缓存命中率
SHOW BACKENDS;
-- 然后访问 BE 的 metrics 页面查看 row_cache_hit_rate
查询示例如下:
-- 创建 Unique 模型表(自动行存)
CREATE TABLE orders (
    order_id BIGINT,
    user_id BIGINT,
    amount DECIMAL(10,2),
    status VARCHAR(20)
) UNIQUE KEY(order_id)
DISTRIBUTED BY HASH(order_id) BUCKETS 32;
-- 查询自动使用行存优化
SELECT * FROM orders WHERE order_id = 1000001;
发布于:2天前 IP属地:四川省
渡不过的奈何桥
渡不过的奈何桥
如果不要求去重结果非常精准的话,可以考虑使用hll近似去重,示例如下:
-- 创建表时使用 HLL 类型
CREATE TABLE page_views (
    page_id INT,
    view_date DATE,
    users HLL HLL_UNION
) AGGREGATE KEY(page_id, view_date);
-- 数据导入
INSERT INTO page_views VALUES
(1001, '2023-10-01', hll_hash(1001)),
(1001, '2023-10-01', hll_hash(1002)),
(1001, '2023-10-01', hll_hash(1001));
-- 查询近似去重结果
SELECT
    page_id,
    view_date,
    hll_union_agg(users) AS approx_unique_users
FROM page_views
GROUPBY page_id, view_date;
注意使用的时候需要对误差进行控制,示例如下:
-- 设置 HLL 精度(默认 12,精度越高误差越小)
SET hll_precision = 16;
发布于:2天前 IP属地:四川省
你深入我心
你深入我心
查询的时候使用bitmap进行精准去重,示例代码如下:
-- 创建表时使用 BITMAP 类型
CREATE TABLE user_actions (
    user_id BIGINT,
    action_date DATE,
    actions BITMAP BITMAP_UNION
) AGGREGATE KEY(user_id, action_date);
-- 数据导入
INSERT INTO user_actions VALUES
(1001, '2023-10-01', to_bitmap(101)),
(1001, '2023-10-01', to_bitmap(102)),
(1001, '2023-10-01', to_bitmap(101));
-- 查询去重结果
SELECT
    user_id,
    action_date,
    bitmap_union_count(actions) AS unique_actions
FROM user_actions
GROUPBY user_id, action_date;
发布于:2天前 IP属地:四川省
丢一地的真心、没人珍惜
丢一地的真心、没人珍惜
bitmap去重去比比使用distinct去重要快5-10倍左右
发布于:2天前 IP属地:四川省
浴血而重生
浴血而重生
使用Runtime Filter进行动态过滤减少join数据量,示例如下:
-- 启用 Runtime Filter
SET enable_runtime_filter = true;
-- 手动调整 Runtime Filter 类型
SET runtime_filter_type = "BLOOM_FILTER";
-- 查看执行计划中的 Runtime Filter
EXPLAIN 
SELECT o.* 
FROM orders o 
JOIN (SELECT user_id FROM vip_users) v 
ON o.user_id = v.user_id;
这里特别说明下对应的filter使用类型:
IN Filter:适用于高基数字段
Bloom Filter:适用于超高基数字段
MinMax Filter:适用于数值类型
发布于:2天前 IP属地:四川省
雨落听船眠
雨落听船眠
使用colocation join进行共址join,保证关联数据在同一节点,适用于频繁join的维度表,示例如下:
-- 创建同组(Group)的表
CREATE TABLE table_a (
    k1 INT,
    ...
) DISTRIBUTED BY HASH(k1) BUCKETS 32
PROPERTIES (
    "colocation_with" = "group1"
);
CREATE TABLE table_b (
    k1 INT,
    ...
) DISTRIBUTED BY HASH(k1) BUCKETS 32
PROPERTIES (
    "colocation_with" = "group1"
);
-- 查询自动使用 Colocation Join
EXPLAIN 
SELECT a.*, b.*
FROM table_a a 
JOIN table_b b ON a.k1 = b.k1;
发布于:2天前 IP属地:四川省
相视而笑
相视而笑
使用bucket shuffle join进行查询,通过数据分布预定位减少网络传输,适用于大表join大表的场景,示例如下:
-- 创建表时指定分布键
CREATE TABLE orders (
    order_id BIGINT,
    user_id BIGINT,
    ...
) DISTRIBUTED BY HASH(user_id) BUCKETS 32;
CREATE TABLE users (
    user_id BIGINT,
    ...
) DISTRIBUTED BY HASH(user_id) BUCKETS 32;
-- 查询自动使用 Bucket Shuffle Join
EXPLAIN 
SELECT o.*, u.name 
FROM orders o 
JOIN users u ON o.user_id = u.user_id;
发布于:2天前 IP属地:四川省
`小囡
`小囡
在查询时,开启sql cache基于查询文本和参数进行精确匹配,示例如下:
-- 启用 SQL Cache
SET enable_sql_cache = true;
-- 查看缓存命中率
SHOW VARIABLES LIKE '%sql_cache%';
在查询时常用的一些缓存优化相关的实践场景如下:
-- 1. 使用参数化查询提高缓存命中率
-- 低效方式(每次参数不同都生成新缓存项)
SELECT*FROM orders WHERE user_id =1001;
SELECT*FROM orders WHERE user_id =1002;
-- 高效方式(使用视图或CTE)
CREATEVIEW user_orders AS
SELECT*FROM orders WHERE user_id = ${user_id};
-- 2. 控制缓存粒度
-- 小结果集查询适合缓存
SELECTCOUNT(*) FROM orders WHEREdate='2023-10-01';
-- 大结果集查询禁用缓存
SET enable_sql_cache =false;
SELECT*FROM large_table;
发布于:2天前 IP属地:四川省
回忆多美好
回忆多美好
可以在查询的时候开启pipelinex引擎,他是在pipeline基础上增加了本地shuffle优化,示例如下:
-- 启用 PipelineX
set enable_pipeline_x_engine = true;
-- 查看执行计划中的 LocalExchange 算子
EXPLAIN SELECT COUNT(*) FROM large_table GROUP BY region;
发布于:2天前 IP属地:四川省
赤脚踏两船
赤脚踏两船
可以在查询的时候开启pipeline引擎通过向量化直销和批处理技术进行优化,示例如下:
-- 启用 Pipeline 引擎
set enable_pipeline_engine = true;
-- 查看执行计划是否使用 Pipeline
EXPLAIN SELECT ... FROM ...;
发布于:2天前 IP属地:四川省
我来回答