Kyligence AI 服务 - 让大模型完成准确、可靠的数值计算和回答! 立即了解更多
AI 数智助理
Kyligence Zen Kyligence Zen
Kyligence Enterprise Kyligence Enterprise
Kyligence Turbo Kyligence Turbo
指标平台解决方案
OLAP 解决方案
行业解决方案
客户总览
金融
零售
制造
医药
其他
云平台
BI
寻求合作
资源
Kyligence Enterprise
Kyligence Zen
培训
Apache Kylin
Byzer
Gluten
博客
关于
市场活动
“随着维度数目的增加,Cuboid 的数量会爆炸式地增长。为了缓解 Cube 的构建压力,Apache Kylin 引入了一系列的高级设置,帮助用户筛选出真正需要的 Cuboid。这些高级设置包括聚合组(Aggregation Group)、联合维度(Joint Dimension)、层级维度(Hierachy Dimension)和必要维度(Mandatory Dimension)等。”
正如上述官方文档提到的,在维度过多时,合理地使用聚合组能解决 Cube 膨胀率过大的问题。听起来那么美好,但是,不合理的聚合组设置将对性能产生灾难性影响。
Apache Kylin 的主要工作就是为源数据构建 N 个维度的 Cube,实现聚合的预计算。从理论上说,构建 N 个维度的 Cube 就会生成 2^N 个 Cuboid。
所以,只要降低最终 Cuboid 的数量,就可以减小膨胀率,达到对 Cube 剪枝的效果。
构建一个 4 个维度(A,B,C, D)的 Cube,就需要生成 16 个Cuboid。
那么问题来了,如果这 4 个维度(A,B,C, D),能够根据某业务逻辑找出一个隐藏的规律,即:当进行聚合时,用户仅仅关注维度 AB 组合和维度 CD 组合(即只会通过维度 A 和 B 或者 C 和 D 进行聚合,而不会通过 A 和 C、B 和 C、A 和 D、B 和 D 进行聚合),那么就可以通过设置聚合组,使生成的 Cuboid 数目从 16 个缩减成 8 个(大大降低 Cube 膨胀率),如下图所示。
上面这段内容来自 Kylin 公众号的【技术帖】Apache Kylin 高级设置:聚合组(Aggregation Group)原理解析这篇文章中,值得对聚合组还不太了解的同学读一读。
但是,这里好像完全没有提到用于过滤数据(而不是聚合)的维度字段,应该怎么处理?
某年某月某日,某业务人员突然发现某张报表的打开速度极其缓慢,并上报给系统管理人员。随后,通过对该报表产生的 SQL 进行筛查,发现了如下一条嫌疑重大的 SQL 语句,拖慢了整个报表的打开速度。
select "A","B",sum("VALUE") from test_agg_group where "D" = 1 group by 1,2;
Kylin 日志信息:
==========================[QUERY]=============================== Query Id: 7fe300c2-211c-9429-eebf-b4cc57bfd679 SQL: select "A","B",sum("VALUE") from test_agg_group where "D" = 1 group by 1,2; User: ADMIN Success: true Duration: 4.891 Project: 0000_reserved Realization Names: [CUBE[name=test_agg_group]] Cuboid Ids: [15] Total scan count: 1000000 Total scan bytes: 51000000 Result row count: 100000 Accept Partial: true Is Partial Result: false Hit Exception Cache: false Storage cache used: false Is Query Push-Down: false Is Prepare: false Trace URL: null Message: null ==========================[QUERY]===============================
因为这是在测试环境(数据量不大)执行的 SQL,所以执行时间为 4.891 秒,生产环境真实的 SQL 执行时间已超过 40 秒,Total scan count 为千万级。但是问题出现的原理和线上是一样的。
对于这种极慢的 SQL,我通常会观察日志信息中的 Total scan count 与 Result row count 数值差异是否巨大。
如果差异极大(例如上述 SQL 的差异已经达到 10 倍),那就意味着该条 SQL 扫描了很多不会被作为最终结果的无用数据。
此时我发现只要删掉那个 where 条件就可以很快的得到响应:
select "A","B",sum("VALUE") from test_agg_group group by 1,2
==========================[QUERY]=============================== Query Id: 2a9d7422-7268-2805-f1ac-a0fc544602c9 SQL: select "A","B",sum("VALUE") from test_agg_group group by 1,2 User: ADMIN Success: true Duration: 0.628 Project: 0000_reserved Realization Names: [CUBE[name=test_agg_group]] Cuboid Ids: [12] Total scan count: 100000 Total scan bytes: 4900000 Result row count: 100000 Accept Partial: true Is Partial Result: false Hit Exception Cache: false Storage cache used: false Is Query Push-Down: false Is Prepare: false Trace URL: null Message: null ==========================[QUERY]===============================
很明显,相比原 SQL,查询的响应时间就提升了好几个数量级。值得注意的是,Total scan count 也从原来的 100w 降到了 10w。
如果是一个传统 RDBMS 的 DBA 看到这一幕,一定会感到疑惑,添加了 where 条件的 SQL 扫描的行数竟然比没有 where 条件的 SQL 扫描的行数更多,简直不可思议。
看到这里,有人可能已经逐渐忘记了标题。
回到这个 Cube 上看一看,它教科书般地使用了聚合组进行剪枝操作,完美的将 AB 和 CD 分到了两个聚合组中,将膨胀率降低了一半。
因此,当我们以 AB 维度进行聚合,D 维度进行过滤,Kylin 在搜索哪些行满足 D=1 这个条件时,就无法通过下图的方式进行搜索了。
因为不会有任何一个 Cuboid(大约 10w 行)像上面这样包含 ABD 三个维度和预计算好的值。所以最终 Kylin 会扫描下面这个 Cuboid (即包含 ABCD 四个字段的 Cuboid,大约有 100w 行)来获取最终数据。
这是一个在聚合组设置不当,且运气还很差的情况下才能触发的问题。
运气差在哪?
通过查看 SQL 执行的日志信息我们也能看到。当以 D 字段为过滤条件时,只能使用包含 ABCD 四个字段的 Cuboid 进行扫描。
但是 C 字段的基数非常大,所以该 Cuboid 的行数也就非常多。同时, C 字段并没有进行筛选,使用了基数非常小的 D 字段进行了筛选(一共 1000w 行,D字段有 500w 行是 1,500w 行是 2)。
最终导致要扫描完 Cuboid ABCD 的 100w 行才能得到计算结果。
那么如果筛选字段不是 D 而是 C,我们尝试下估算下需要扫描多少行呢?
select "A","B",sum("VALUE") from test_agg_group where "C" = 100000 group by 1,2
==========================[QUERY]=============================== Query Id: e304ae37-f7ec-233b-d353-845e2feba908 SQL: select "A","B",sum("VALUE") from test_agg_group where "C" = 100000 group by 1,2 User: ADMIN Success: true Duration: 0.806 Project: 0000_reserved Realization Names: [CUBE[name=test_agg_group]] Cuboid Ids: [15] Total scan count: 2 Total scan bytes: 102 Result row count: 2 Accept Partial: true Is Partial Result: false Hit Exception Cache: false Storage cache used: false Is Query Push-Down: false Is Prepare: false Trace URL: null Message: null ==========================[QUERY]===============================
仅需要扫描个位数的行即可,因为 C 字段基数大,包含的重复值很少。而且我们可以看到,这条 SQL 和最初的 SQL 都是用了 Cuboid Id 为 15 的 Cuboid 进行查询,也就是包含了 ABCD 四个字段的 Cuboid。
而仅用了 AB 两个字段,不使用 CD 中任何一个字段进行筛选的 SQL 使用了 Cuboid Id 为 12 的 Cuboid。
分聚合组时,哪怕用户仅仅关注维度 AB 组合和维度 CD 组合,但用户会可能用 D 作为过滤条件来查询 AB 组合,就一定要保证 ABD 要分到同一个聚合组当中。
当然了,如果字段的基数不像例子中这么极端,聚合组随便怎么分对性能影响应该都不大。但是,如果哪天墨菲定律突然上线,希望大家能想起本文。
近年来,随着商业环境的竞争日益激烈,企业对于实时数据服务的需求急剧增加。Kyligence 在服务众多客户的过
数据要素在银行各业务领域和流程中发挥着至关重要的作用,面对激烈的市场竞争和客户需求,银行越来越注重从数据管理中
作为一名消费者,炎热的夏天我们会走进一家便利店,从冰柜中选出一瓶汽水;下午工作有点累了,我们会在公司的自动贩卖
2024 年伊始,Kyligence 联合创始人兼 CEO 韩卿(Luke)分享了对 AI 与数据行业的一些战
房地产行业是我国国民经济中的重要支柱产业之一,在房地产市场供求关系发生重大变化的当下,房企面临多重挑战。Kyl
今年年初,Kyligence 高级副总裁兼合伙人葛双寅(Silas Ge)受邀在阿斯利康“跃行致远三十周年年会
2024 年伊始,Kyligence 联合创始人兼 CEO 韩卿在公司内部的飞书订阅号发表了多篇 Rethin
400 8658 757
工作日:10:00 - 18:00
已有账号? 点此登陆
预约演示,您将获得
完整的产品体验
从数据导入、建模到分析的全流程操作演示。
行业专家解惑
与资深行业专家的交流机会,解答您的个性化问题。
请填写真实信息,我们会在 1-2 个工作日内电话与您联系。
全行业落地场景演示
涵盖金融、零售、餐饮、医药、制造等多个行业,最贴合您的业务需求与场景。
Data + AI 应用落地咨询
与资深技术专家深入交流,助您的企业快速落地 AI 场景应用。
立即预约,您将获得
精准数据计算能力:
接入高精度数值计算大模型服务,为您的企业级AI应用提供强大支持。
个性化业务场景解决方案:
量身定制的计算模型和数据分析服务,切实贴合您的业务需求和应用场景。
Data + AI 落地应用咨询:
与资深专家深入探讨数据和 AI 如何帮助您的企业加速实现应用落地,构建更智能的数据驱动未来。
申请体验,您将获得
体验数据处理性能 2x 加速
同等规模资源、同等量级数据、同一套数据处理逻辑,处理耗时下降一半
专家支持
试用部署、生成数据、性能对比各操作环节在线支持