1 如果你想查询二级分区数据量应该是 SELECT COUNT(1) from qt_order PARTITION(p202405sp0);
2 二级分区如果是hash分区的话,个人好像是没听ob有啥反推的算法的。
一般都是通过explain 看执行计划中扫描了多少个分区 ,下面测试中第一个sql是查询一个一级分区,你会看到扫描了所有二级分区 partitions(p0sp[0-7]) 查询了7个分区表,第二个sql值子查询了一个二级分区,也就是子查询了一个分区partitions(p0sp)
CREATE TABLE `test1` (
`rowkey` varchar(64) NOT NULL COMMENT '主键',
`tenant_id` varchar(64) NOT NULL COMMENT '租户id',
`log_time` datetime(3) NOT NULL COMMENT '日志时间',
PRIMARY KEY (`rowkey`, `log_time`, `tenant_id`)
)
partition by range columns(log_time) subpartition by key(tenant_id) subpartition template (
subpartition p0,
subpartition p1,
subpartition p2,
subpartition p3,
subpartition p4,
subpartition p5,
subpartition p6,
subpartition p7)
(
partition p202404 values less than ('2024-05-01 00:00:00'),
partition p202405 values less than ('2024-06-01 00:00:00'),
partition p202406 values less than ('2024-07-01 00:00:00'),
partition p202407 values less than ('2024-08-01 00:00:00'),
partition p202408 values less than ('2024-09-01 00:00:00'),
partition p202409 values less than ('2024-10-01 00:00:00'),
partition p202410 values less than ('2024-11-01 00:00:00'),
partition p202411 values less than ('2024-12-01 00:00:00'),
partition p202412 values less than ('2025-01-01 00:00:00'));
insert into test1 values('aaaaaaaaaaa','aaaaaa','2024-04-10');
insert into test1 values('aaaaaaaaa1a','aaaa1a','2024-04-11');
insert into test1 values('bbbbbbbbbbb','bbbbbb','2024-05-10');
insert into test1 values('ccccccccccc','cccccc','2024-06-10');
insert into test1 values('ddddddddddd','dddddd','2024-07-10');
insert into test1 values('eeeeeeeeeee','eeeeee','2024-08-10');
insert into test1 values('fffffffffff','ffffff','2024-09-10');
insert into test1 values('ggggggggggg','gggggg','2024-10-10');
insert into test1 values('hhhhhhhhhhh','hhhhhh','2024-11-10');
explain select * from test1 where log_time='2024-04-10' ;
====================================================
|ID|OPERATOR |NAME |EST. ROWS|COST|
----------------------------------------------------
|0 |PX COORDINATOR | |1 |47 |
|1 | EXCHANGE OUT DISTR |:EX10000|1 |46 |
|2 | PX PARTITION ITERATOR| |1 |46 |
|3 | TABLE SCAN |test1 |1 |46 |
====================================================
Outputs & filters:
-------------------------------------
0 - output([INTERNAL_FUNCTION(test1.rowkey, test1.tenant_id, test1.log_time)]), filter(nil)
1 - output([INTERNAL_FUNCTION(test1.rowkey, test1.tenant_id, test1.log_time)]), filter(nil), dop=1
2 - output([test1.log_time], [test1.tenant_id], [test1.rowkey]), filter(nil)
3 - output([test1.log_time], [test1.tenant_id], [test1.rowkey]), filter([test1.log_time = ?]),
access([test1.log_time], [test1.tenant_id], [test1.rowkey]), partitions(p0sp[0-7])
explain select * from test1 where log_time='2024-04-10' and tenant_id='aaaaaa' ;
obclient [test]> explain select * from test1 where log_time='2024-04-10' and tenant_id='aaaaaa' ;;
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Query Plan |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| ====================================
|ID|OPERATOR |NAME |EST. ROWS|COST|
------------------------------------
|0 |TABLE SCAN|test1|1 |46 |
====================================
Outputs & filters:
-------------------------------------
0 - output([test1.rowkey], [test1.tenant_id], [test1.log_time]), filter([test1.log_time = ?], [test1.tenant_id = 'aaaaaa']),
access([test1.log_time], [test1.tenant_id], [test1.rowkey]), partitions(p0sp)