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属地:四川省
利用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属地:四川省
我来回答
您需要 登录 后回答此问题!