1 概述
在数据处理与分析场景中,当数据量庞大时,查询效率成为关键问题。
当用户在数据源库中设置了分区,也想在Smartbi 查询报表时,能直接命中分区,使查询语句能快速定位到所需数据,从而大幅提升查询性能。
所以推出了新功能,该功能允许用户在数据连接和数据模型中配置分区字段相关信息,确保查询时能精准命中分区,减少数据库压力,提升系统整体运行效率。
前提条件
2 适合场景
- 事实表数据量大(如订单表、交易表),且已按日期(如年月日、年月)分区。
3 场景限制
- 分区字段仅支持整型、字符串、日期类型。其他数据类型的字段无法设为分区字段。
- 在数据模型中,目前只支持直连模式,通过分区字段进行加速;抽取模式还不支持。
- 在数据模型中只支持在“数据源表”设置分区字段,其他类型的查询不支持设置分区。
- 不支持“年周”的作为过滤条件来命中分区。
- 设置好的分区字段及其关联维表,暂不支持命中包含快速计算(如同期值、前期值、环比、同比等)的查询场景。即使配置了分区,涉及此类计算的报表仍可能无法利用分区优化。
- 过滤操作符限制:详细可查看4章节。
3 具体示例
3.1 分区字段字符串:在事实表上设置了分区字段,使用分区字段作为过滤条件
如果使用事实表分区字段作为过滤条件,这个产品本身就可以直接命中的,不需要任何设置。
以MYSQL数据库表创建分区为例进行说明
1、连接到mysql数据库中创建表:DateExchange,同时给设置好分区,如下图:
创建表时,以”年月日“进行分区,当“年月日”<20250101时,需要命中“p202501”;当“年月日”<20250201时 需要命中”p202502“;当“年月日”<20250301时 需要命中”p202503“;当“年月日”符合其他条件,那就命中”other“。
2、创建好表,给表灌几条数据,如下图:
3、去创建数据模型,把该表加入到数据模型中,保存数据模型:
4、去创建透视分析,让”年月日“作为过滤条件:
5、去到系统监控/SQL/MDX监控中查看并复制运行的取数SQL语句:
6、去到mysql数据库中,使用explain +上一步复制的SQL的语句,执行,查看命中了哪个分区:
可以看到上图,命中了”p202502“分区。如果partitions显示了:p202501,p202502,p202503,other, 则代表没有命中分区。
3.2 分区字段字符串:在事实表上设置了分区字段,使用关联的维表的时间维度作为过滤条件
以3.1示例创建的表以及分区为例进行说明
1、在数据库下的表进行“分区设置”
2、设置分区字段:
- 分区字段:可以选择日期、字符串、整型字段。
- 当选择”日期“字段无需设置“数据格式”,当选择”字符串“或”整型“字段时,需要设置”数据格式“。
- 数据格式:必须与分区字段在数据库中的真实数据格式一致,否则查询时可能出错或命中不了。示例中“年月日”的数据是“20250101”这样的,所以数据格式也要选择与之匹配的“yyyyMMdd”。
3、设置好分区字段之后去创建模型,添加一个维表,让它与事实表关联,如下图:
4、创建模型,把在数据库表上的分区同步过来:
- 入口:数据源表的右键菜单增加了“分区设置”。点击“分区设置”每次都需要把源数据库中设置中的分区信息同步过来:
- 点击【确定】之后,到模型的分区设置,需要设置 时间维度:
- 时间维度:必须选择基于“分区字段”或者关联的日期维表所创建的时间维度,否则查询时可能出错,或者查询数据不正确。
- 禁用:当勾选了”禁用此分区设置“,这个分区设置不会生效。
5、基于该模型去创建透视分析,使用日期时间维度的“年月”作为过滤条件:
6、去到系统监控/SQL/MDX监控中查看并复制运行的取数SQL语句:
不管是走的源库还是SQL引擎V2.0、多维引擎,都是拷贝在源库生成的SQL语句去到源库执行。
7、去到mysql数据库中,使用explain +上一步复制的SQL的语句,执行,查看命中了哪个分区:
可以看到上图,命中了”p202503“分区。
8、再使用“年季”的作为过滤条件:
与步骤6、7一样,去系统监控拷贝执行SQL语句到mysql数据库中用explain 执行,发现也能命中分区:
总结:关联的日期维表所创建的时间维度下面的所有时间层次作为过滤条件,都能命中分区。
3.3 分区字段为日期:在事实表上设置了分区字段,使用分区字段自己生成的时间维度作为过滤条件
以mysql数据库表创建分区为例进行说明
连接到mysql数据库中创建表:orders_partition,同时给设置好分区,如下图:
创建表时,以”OrderDate“进行分区,当“OrderDate”<2020-02-01 00:00:00时,需要命中“p202001”;当“OrderDate”<2020-03-01 00:00:00时 需要命中”p202002“;当“年月日”符合其他条件,那就命中”p_future“。
orders_partition的数据效果如下:
1、把orders_partition表通过 数据库管理,把表加载到数据源下,并设置分区字段:
分区字段:可以选择日期、字符串、整型字段,这里选择在数据库中设置的分区字段“OrderDate”:
点击【确定】保存设置的分区信息,下次打开会显示上一次设置的信息。
2、去创建数据模型,并基于orders_partition的“orderDate”字段创建时间维度, 并同步“分区信息”到数据模型中:
时间维度:必须选择基于“分区字段”、或者关联的日期维表所创建的时间维度。否则查询时可能出错,或者查询数据不正确。
3、保存数据模型,去创建透视分析:
4、去到系统监控/SQL/MDX监控中查看并复制运行的取数SQL语句:
7、去到mysql数据库中,使用explain +上一步复制的SQL的语句,执行,查看命中了哪个分区:
看下图可以看到是命中了"p202002"区。
3.4 分区字段为日期:在事实表上设置了分区字段,使用关联的维表的时间维度作为过滤条件
以3.3创建的数据模型为例说明。
1、在模型中增加”日期表“作为orders_partition的维表,如下图:
2、分区设置指定时间维度为”日期表“生成的时间维:
3、保存模型并创建透视分析:
4、去到系统监控/SQL/MDX监控中查看并复制运行的取数SQL语句;去到mysql数据库中,使用explain +上一步复制的SQL的语句,执行,查看命中了哪个分区:
看下图可以看到是命中了"p_future"区。
3.5 分区字段是”整形“情况
界面操作、逻辑与3.1、3.2章节一致。
4 报表层哪些操作符能命中分区
- 过滤操作符限制:部分过滤操作符在特定场景下不支持命中分区。以 “年月” 分区字段为例,“不等于”“not in” 等操作符,在开发实际中无法做到命中分区;“like” 操作符对字符串日期字段作过滤条件时也不支持命中分区 。
查询中指定的过滤字段 | 操作符 | |
年(例:2024) 年月日(例:2024-09-29) 年月(例:2024-09) 年季(列:2024Q1) | =、in | 支持 |
> | ||
>= | ||
< | ||
<= | ||
!=、not in | 不支持 |