From 95ba872b5693d5a757b254b3999cfe6c7099f2af Mon Sep 17 00:00:00 2001 From: helloamateur Date: Fri, 1 Nov 2024 04:48:30 +0000 Subject: [PATCH] [GIS] fix spatial index rebuild for partition table --- src/share/ob_ddl_common.cpp | 16 +- src/sql/rewrite/ob_query_range.cpp | 2 +- .../geometry_partition_table_mysql.result | 196 ++++++++++++++++++ .../t/geometry_partition_table_mysql.test | 55 +++++ 4 files changed, 262 insertions(+), 7 deletions(-) diff --git a/src/share/ob_ddl_common.cpp b/src/share/ob_ddl_common.cpp index 6a89010e6..d52a686ea 100644 --- a/src/share/ob_ddl_common.cpp +++ b/src/share/ob_ddl_common.cpp @@ -777,6 +777,8 @@ int ObDDLUtil::generate_spatial_index_column_names(const ObTableSchema &dest_tab if (OB_ISNULL(column_schema = dest_table_schema.get_column_schema(col_id))) { ret = OB_ERR_UNEXPECTED; LOG_WARN("error unexpected, column schema must not be nullptr", K(ret)); + } else if (is_contain(select_column_ids, col_id)) { + // do nothing } else if (OB_FAIL(insert_column_names.push_back(ObColumnNameInfo(column_schema->get_column_name_str(), false)))) { LOG_WARN("push back insert column name failed", K(ret)); } else if (OB_FAIL(column_names.push_back(ObColumnNameInfo(column_schema->get_column_name_str(), false)))) { @@ -902,12 +904,7 @@ int ObDDLUtil::generate_build_replica_sql( bool is_shadow_column = false; const int64_t real_parallelism = ObDDLUtil::get_real_parallelism(parallelism, false/*is mv refresh*/); // get dest table column names - if (dest_table_schema->is_spatial_index()) { - if (OB_FAIL(ObDDLUtil::generate_spatial_index_column_names(*dest_table_schema, *source_table_schema, insert_column_names, - column_names, select_column_ids))) { - LOG_WARN("generate spatial index column names failed", K(ret)); - } - } else if (OB_FAIL(dest_table_schema->get_column_ids(column_ids))) { + if (OB_FAIL(dest_table_schema->get_column_ids(column_ids))) { LOG_WARN("fail to get column ids", K(ret)); } else { for (int64_t i = 0; OB_SUCC(ret) && i < column_ids.count(); ++i) { @@ -1004,6 +1001,13 @@ int ObDDLUtil::generate_build_replica_sql( LOG_WARN("fail append extra column", K(ret)); } + if (OB_SUCC(ret) && dest_table_schema->is_spatial_index()) { + if (OB_FAIL(ObDDLUtil::generate_spatial_index_column_names(*dest_table_schema, *source_table_schema, insert_column_names, + column_names, select_column_ids))) { + LOG_WARN("generate spatial index column names failed", K(ret)); + } + } + // get dest table rowkey columns if (OB_SUCC(ret)) { const ObRowkeyInfo &rowkey_info = dest_table_schema->get_rowkey_info(); diff --git a/src/sql/rewrite/ob_query_range.cpp b/src/sql/rewrite/ob_query_range.cpp index 66fb2da7d..bb60a6524 100644 --- a/src/sql/rewrite/ob_query_range.cpp +++ b/src/sql/rewrite/ob_query_range.cpp @@ -790,7 +790,7 @@ int ObQueryRange::preliminary_extract_query_range(const ColumnIArray &range_colu // ignore the condition from which we can not extract query range } else if (cur_expr->has_flag(CNT_DYNAMIC_PARAM) && OB_FALSE_IT(has_exec_param_ = true)) { - } else if (is_contain_geo_filters()) { + } else if (is_contain_geo_filters() && is_single_domain_op(cur_expr)) { // or connect with spatial filters for functional correctness has_geo_expr = true; if (OB_FAIL(add_or_item(geo_ranges, temp_result))) { diff --git a/tools/deploy/mysql_test/test_suite/geometry/r/mysql/geometry_partition_table_mysql.result b/tools/deploy/mysql_test/test_suite/geometry/r/mysql/geometry_partition_table_mysql.result index b9e21227f..dbb253e7e 100644 --- a/tools/deploy/mysql_test/test_suite/geometry/r/mysql/geometry_partition_table_mysql.result +++ b/tools/deploy/mysql_test/test_suite/geometry/r/mysql/geometry_partition_table_mysql.result @@ -385,3 +385,199 @@ select /*+index(partition_t1 idx)*/ st_astext(g) from partition_t1 where st_inte st_astext(g) POINT(1 1) drop table partition_t1; +create table ptgeom1(c1 int, g geometry not null srid 0, g1 geometry not null srid 0) partition by hash(c1) partitions 3; +insert into ptgeom1 values (0, st_geomfromtext('point(1 1)'), st_geomfromtext('point(2 2)')); +insert into ptgeom1 values (1, st_geomfromtext('point(1 0)'), st_geomfromtext('point(2 2)')); +select st_astext(g) from ptgeom1 where st_intersects(g, st_geomfromtext('point(1 1)')); +st_astext(g) +POINT(1 1) +create index pgidx1 on ptgeom1(g) local; +explain select /*+index(ptgeom1 pgidx1)*/ st_astext(g) from ptgeom1 where st_intersects(g, st_geomfromtext('point(1 1)')); +Query Plan +==================================================================== +|ID|OPERATOR |NAME |EST.ROWS|EST.TIME(us)| +-------------------------------------------------------------------- +|0 |PX COORDINATOR | |1 |420 | +|1 |└─EXCHANGE OUT DISTR |:EX10000 |1 |420 | +|2 | └─PX PARTITION ITERATOR| |1 |419 | +|3 | └─TABLE FULL SCAN |ptgeom1(pgidx1)|1 |419 | +==================================================================== +Outputs & filters: +------------------------------------- + 0 - output([INTERNAL_FUNCTION(st_astext(ptgeom1.g))]), filter(nil) + 1 - output([INTERNAL_FUNCTION(st_astext(ptgeom1.g))]), filter(nil) + dop=1 + 2 - output([ptgeom1.g]), filter(nil) + force partition granule + 3 - output([ptgeom1.g]), filter([st_intersects(ptgeom1.g, st_geomfromtext('point(1 1)'))]) + access([ptgeom1.__pk_increment], [ptgeom1.g]), partitions(p[0-2]) + is_index_back=true, is_global_index=false, filter_before_indexback[false], + range_key([ptgeom1.__cellid_17], [ptgeom1.__mbr_17], [ptgeom1.__pk_increment]), range(1152921504606846980,MIN,MIN ; 1152921504606846980,MAX,MAX), + (1152921504606846992,MIN,MIN ; 1152921504606846992,MAX,MAX), (1152921504606847040,MIN,MIN ; 1152921504606847040,MAX,MAX), (1152921504606847232,MIN,MIN ; + 1152921504606847232,MAX,MAX), (1152921504606848000,MIN,MIN ; 1152921504606848000,MAX,MAX), (1152921504606851072,MIN,MIN ; 1152921504606851072,MAX,MAX), + (1152921504606863360,MIN,MIN ; 1152921504606863360,MAX,MAX), (1152921504606912512,MIN,MIN ; 1152921504606912512,MAX,MAX), (1152921504607109120,MIN,MIN ; + 1152921504607109120,MAX,MAX), (1152921504607895552,MIN,MIN ; 1152921504607895552,MAX,MAX), (1152921504611041280,MIN,MIN ; 1152921504611041280,MAX,MAX), + (1152921504623624192,MIN,MIN ; 1152921504623624192,MAX,MAX), (1152921504673955840,MIN,MIN ; 1152921504673955840,MAX,MAX), (1152921504875282432,MIN,MIN ; + 1152921504875282432,MAX,MAX), (1152921505680588800,MIN,MIN ; 1152921505680588800,MAX,MAX), (1152921508901814272,MIN,MIN ; 1152921508901814272,MAX,MAX), + (1152921521786716160,MIN,MIN ; 1152921521786716160,MAX,MAX), (1152921573326323712,MIN,MIN ; 1152921573326323712,MAX,MAX), (1152921779484753920,MIN,MIN ; + 1152921779484753920,MAX,MAX), (1152922604118474752,MIN,MIN ; 1152922604118474752,MAX,MAX), (1152925902653358080,MIN,MIN ; 1152925902653358080,MAX,MAX), + (1152939096792891392,MIN,MIN ; 1152939096792891392,MAX,MAX), (1152991873351024640,MIN,MIN ; 1152991873351024640,MAX,MAX), (1153202979583557632,MIN,MIN ; + 1153202979583557632,MAX,MAX), (1154047404513689600,MIN,MIN ; 1154047404513689600,MAX,MAX), (1157425104234217472,MIN,MIN ; 1157425104234217472,MAX,MAX), + (1170935903116328960,MIN,MIN ; 1170935903116328960,MAX,MAX), (1224979098644774912,MIN,MIN ; 1224979098644774912,MAX,MAX), (1441151880758558720,MIN,MIN ; + 1441151880758558720,MAX,MAX), (1152921504606846976,MIN,MIN ; 1152921504606846976,MAX,MAX), (1152921504606846977,MIN,MIN ; 1152921504606846977,MAX,MAX) +select /*+index(ptgeom1 pgidx1)*/ st_astext(g) from ptgeom1 where st_intersects(g, st_geomfromtext('point(1 1)')); +st_astext(g) +POINT(1 1) +drop table ptgeom1; +DROP TABLE IF EXISTS group_change_info; +create table group_change_info( +`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', +`geom` geometry NOT NULL /*!80003 SRID 0 */, +`city_code` int(11) NOT NULL COMMENT '分区分表key', +`change_status` varchar(32) NOT NULL COMMENT '变化状态: ● INIT 初始\n● PROCESSING 进入产线\n● SUCCESS 产线变更完成\n● MTL_NG 采集NG\n● DELETE 删除\n● INTERCEPT 已拦截\n● DIFF_NG 差分NG', +`change_date` datetime NOT NULL COMMENT '变化时间,本来带的属性', +PRIMARY KEY (`id`, `city_code`), +SPATIAL KEY `idx_geom` (`geom`) BLOCK_SIZE 16384 LOCAL COMMENT '变化范围' +) partition by list(city_code) (partition `p10` values in (10), partition `p20` values in (20)); +insert into group_change_info values(1, st_geomfromtext('point(1 1)', 0), 10, 'SUCCESS', '2023-06-07 00:00:00'), +(2, st_geomfromtext('point(1 0)', 0), 10, 'SUCCESS', '2023-06-07 00:00:00'), +(3, st_geomfromtext('point(1 1)', 0), 10, 'DELETE', '2023-06-07 00:00:00'), +(4, st_geomfromtext('point(1 1)', 0), 20, 'SUCCESS', '2023-06-07 00:00:00'), +(5, st_geomfromtext('point(1 1)', 0), 10, 'SUCCESS', '2023-06-06 00:00:00'); +explain select id, st_astext(geom) from group_change_info where st_intersects(geom, st_geomfromtext('point(1 1)', 0)) and city_code = 10 +and change_status in ('INIT', 'PROCESSING', 'SUCCESS', 'DIFF_NG') and change_date != '2023-06-06 00:00:00'; +Query Plan +====================================================================== +|ID|OPERATOR |NAME |EST.ROWS|EST.TIME(us)| +---------------------------------------------------------------------- +|0 |TABLE FULL SCAN|group_change_info(idx_geom)|1 |156 | +====================================================================== +Outputs & filters: +------------------------------------- + 0 - output([group_change_info.id], [st_astext(group_change_info.geom)]), filter([group_change_info.city_code = 10], [group_change_info.change_date != + INTERNAL_FUNCTION('2023-06-06 00:00:00', 116, 17)], [st_intersects(group_change_info.geom, st_geomfromtext('point(1 1)', 0))], [group_change_info.change_status + IN ('INIT', 'PROCESSING', 'SUCCESS', 'DIFF_NG')]) + access([group_change_info.id], [group_change_info.city_code], [group_change_info.geom], [group_change_info.change_status], [group_change_info.change_date]), partitions(p0) + is_index_back=true, is_global_index=false, filter_before_indexback[true,false,false,false], + range_key([group_change_info.__cellid_17], [group_change_info.__mbr_17], [group_change_info.id], [group_change_info.city_code]), range(1152921504606846980, + MIN,MIN,MIN ; 1152921504606846980,MAX,MAX,MAX), (1152921504606846992,MIN,MIN,MIN ; 1152921504606846992,MAX,MAX,MAX), (1152921504606847040,MIN,MIN,MIN ; + 1152921504606847040,MAX,MAX,MAX), (1152921504606847232,MIN,MIN,MIN ; 1152921504606847232,MAX,MAX,MAX), (1152921504606848000,MIN,MIN,MIN ; 1152921504606848000, + MAX,MAX,MAX), (1152921504606851072,MIN,MIN,MIN ; 1152921504606851072,MAX,MAX,MAX), (1152921504606863360,MIN,MIN,MIN ; 1152921504606863360,MAX,MAX,MAX), + (1152921504606912512,MIN,MIN,MIN ; 1152921504606912512,MAX,MAX,MAX), (1152921504607109120,MIN,MIN,MIN ; 1152921504607109120,MAX,MAX,MAX), (1152921504607895552, + MIN,MIN,MIN ; 1152921504607895552,MAX,MAX,MAX), (1152921504611041280,MIN,MIN,MIN ; 1152921504611041280,MAX,MAX,MAX), (1152921504623624192,MIN,MIN,MIN ; + 1152921504623624192,MAX,MAX,MAX), (1152921504673955840,MIN,MIN,MIN ; 1152921504673955840,MAX,MAX,MAX), (1152921504875282432,MIN,MIN,MIN ; 1152921504875282432, + MAX,MAX,MAX), (1152921505680588800,MIN,MIN,MIN ; 1152921505680588800,MAX,MAX,MAX), (1152921508901814272,MIN,MIN,MIN ; 1152921508901814272,MAX,MAX,MAX), + (1152921521786716160,MIN,MIN,MIN ; 1152921521786716160,MAX,MAX,MAX), (1152921573326323712,MIN,MIN,MIN ; 1152921573326323712,MAX,MAX,MAX), (1152921779484753920, + MIN,MIN,MIN ; 1152921779484753920,MAX,MAX,MAX), (1152922604118474752,MIN,MIN,MIN ; 1152922604118474752,MAX,MAX,MAX), (1152925902653358080,MIN,MIN,MIN ; + 1152925902653358080,MAX,MAX,MAX), (1152939096792891392,MIN,MIN,MIN ; 1152939096792891392,MAX,MAX,MAX), (1152991873351024640,MIN,MIN,MIN ; 1152991873351024640, + MAX,MAX,MAX), (1153202979583557632,MIN,MIN,MIN ; 1153202979583557632,MAX,MAX,MAX), (1154047404513689600,MIN,MIN,MIN ; 1154047404513689600,MAX,MAX,MAX), + (1157425104234217472,MIN,MIN,MIN ; 1157425104234217472,MAX,MAX,MAX), (1170935903116328960,MIN,MIN,MIN ; 1170935903116328960,MAX,MAX,MAX), (1224979098644774912, + MIN,MIN,MIN ; 1224979098644774912,MAX,MAX,MAX), (1441151880758558720,MIN,MIN,MIN ; 1441151880758558720,MAX,MAX,MAX), (1152921504606846976,MIN,MIN,MIN ; + 1152921504606846976,MAX,MAX,MAX), (1152921504606846977,MIN,MIN,MIN ; 1152921504606846977,MAX,MAX,MAX) +select id, st_astext(geom) from group_change_info where st_intersects(geom, st_geomfromtext('point(1 1)', 0)) and city_code = 10 +and change_status in ('INIT', 'PROCESSING', 'SUCCESS', 'DIFF_NG') and change_date != '2023-06-06 00:00:00'; +id st_astext(geom) +1 POINT(1 1) +explain select id, st_astext(geom) from group_change_info where city_code = 10 and st_intersects(geom, st_geomfromtext('point(1 1)', 0)) +and change_status in ('INIT', 'PROCESSING', 'SUCCESS', 'DIFF_NG') and change_date != '2023-06-06 00:00:00'; +Query Plan +====================================================================== +|ID|OPERATOR |NAME |EST.ROWS|EST.TIME(us)| +---------------------------------------------------------------------- +|0 |TABLE FULL SCAN|group_change_info(idx_geom)|1 |137 | +====================================================================== +Outputs & filters: +------------------------------------- + 0 - output([group_change_info.id], [st_astext(group_change_info.geom)]), filter([group_change_info.city_code = 10], [group_change_info.change_date != + INTERNAL_FUNCTION('2023-06-06 00:00:00', 116, 17)], [st_intersects(group_change_info.geom, st_geomfromtext('point(1 1)', 0))], [group_change_info.change_status + IN ('INIT', 'PROCESSING', 'SUCCESS', 'DIFF_NG')]) + access([group_change_info.id], [group_change_info.city_code], [group_change_info.geom], [group_change_info.change_status], [group_change_info.change_date]), partitions(p0) + is_index_back=true, is_global_index=false, filter_before_indexback[true,false,false,false], + range_key([group_change_info.__cellid_17], [group_change_info.__mbr_17], [group_change_info.id], [group_change_info.city_code]), range(1152921504606846980, + MIN,MIN,MIN ; 1152921504606846980,MAX,MAX,MAX), (1152921504606846992,MIN,MIN,MIN ; 1152921504606846992,MAX,MAX,MAX), (1152921504606847040,MIN,MIN,MIN ; + 1152921504606847040,MAX,MAX,MAX), (1152921504606847232,MIN,MIN,MIN ; 1152921504606847232,MAX,MAX,MAX), (1152921504606848000,MIN,MIN,MIN ; 1152921504606848000, + MAX,MAX,MAX), (1152921504606851072,MIN,MIN,MIN ; 1152921504606851072,MAX,MAX,MAX), (1152921504606863360,MIN,MIN,MIN ; 1152921504606863360,MAX,MAX,MAX), + (1152921504606912512,MIN,MIN,MIN ; 1152921504606912512,MAX,MAX,MAX), (1152921504607109120,MIN,MIN,MIN ; 1152921504607109120,MAX,MAX,MAX), (1152921504607895552, + MIN,MIN,MIN ; 1152921504607895552,MAX,MAX,MAX), (1152921504611041280,MIN,MIN,MIN ; 1152921504611041280,MAX,MAX,MAX), (1152921504623624192,MIN,MIN,MIN ; + 1152921504623624192,MAX,MAX,MAX), (1152921504673955840,MIN,MIN,MIN ; 1152921504673955840,MAX,MAX,MAX), (1152921504875282432,MIN,MIN,MIN ; 1152921504875282432, + MAX,MAX,MAX), (1152921505680588800,MIN,MIN,MIN ; 1152921505680588800,MAX,MAX,MAX), (1152921508901814272,MIN,MIN,MIN ; 1152921508901814272,MAX,MAX,MAX), + (1152921521786716160,MIN,MIN,MIN ; 1152921521786716160,MAX,MAX,MAX), (1152921573326323712,MIN,MIN,MIN ; 1152921573326323712,MAX,MAX,MAX), (1152921779484753920, + MIN,MIN,MIN ; 1152921779484753920,MAX,MAX,MAX), (1152922604118474752,MIN,MIN,MIN ; 1152922604118474752,MAX,MAX,MAX), (1152925902653358080,MIN,MIN,MIN ; + 1152925902653358080,MAX,MAX,MAX), (1152939096792891392,MIN,MIN,MIN ; 1152939096792891392,MAX,MAX,MAX), (1152991873351024640,MIN,MIN,MIN ; 1152991873351024640, + MAX,MAX,MAX), (1153202979583557632,MIN,MIN,MIN ; 1153202979583557632,MAX,MAX,MAX), (1154047404513689600,MIN,MIN,MIN ; 1154047404513689600,MAX,MAX,MAX), + (1157425104234217472,MIN,MIN,MIN ; 1157425104234217472,MAX,MAX,MAX), (1170935903116328960,MIN,MIN,MIN ; 1170935903116328960,MAX,MAX,MAX), (1224979098644774912, + MIN,MIN,MIN ; 1224979098644774912,MAX,MAX,MAX), (1441151880758558720,MIN,MIN,MIN ; 1441151880758558720,MAX,MAX,MAX), (1152921504606846976,MIN,MIN,MIN ; + 1152921504606846976,MAX,MAX,MAX), (1152921504606846977,MIN,MIN,MIN ; 1152921504606846977,MAX,MAX,MAX) +select id, st_astext(geom) from group_change_info where city_code = 10 and st_intersects(geom, st_geomfromtext('point(1 1)', 0)) +and change_status in ('INIT', 'PROCESSING', 'SUCCESS', 'DIFF_NG') and change_date != '2023-06-06 00:00:00'; +id st_astext(geom) +1 POINT(1 1) +explain select id, st_astext(geom) from group_change_info where city_code = 10 and change_status in ('INIT', 'PROCESSING', 'SUCCESS', 'DIFF_NG') +and change_date != '2023-06-06 00:00:00' and st_intersects(geom, st_geomfromtext('point(1 1)', 0)); +Query Plan +====================================================================== +|ID|OPERATOR |NAME |EST.ROWS|EST.TIME(us)| +---------------------------------------------------------------------- +|0 |TABLE FULL SCAN|group_change_info(idx_geom)|1 |136 | +====================================================================== +Outputs & filters: +------------------------------------- + 0 - output([group_change_info.id], [st_astext(group_change_info.geom)]), filter([group_change_info.city_code = 10], [group_change_info.change_date != + INTERNAL_FUNCTION('2023-06-06 00:00:00', 116, 17)], [st_intersects(group_change_info.geom, st_geomfromtext('point(1 1)', 0))], [group_change_info.change_status + IN ('INIT', 'PROCESSING', 'SUCCESS', 'DIFF_NG')]) + access([group_change_info.id], [group_change_info.city_code], [group_change_info.geom], [group_change_info.change_status], [group_change_info.change_date]), partitions(p0) + is_index_back=true, is_global_index=false, filter_before_indexback[true,false,false,false], + range_key([group_change_info.__cellid_17], [group_change_info.__mbr_17], [group_change_info.id], [group_change_info.city_code]), range(1152921504606846980, + MIN,MIN,MIN ; 1152921504606846980,MAX,MAX,MAX), (1152921504606846992,MIN,MIN,MIN ; 1152921504606846992,MAX,MAX,MAX), (1152921504606847040,MIN,MIN,MIN ; + 1152921504606847040,MAX,MAX,MAX), (1152921504606847232,MIN,MIN,MIN ; 1152921504606847232,MAX,MAX,MAX), (1152921504606848000,MIN,MIN,MIN ; 1152921504606848000, + MAX,MAX,MAX), (1152921504606851072,MIN,MIN,MIN ; 1152921504606851072,MAX,MAX,MAX), (1152921504606863360,MIN,MIN,MIN ; 1152921504606863360,MAX,MAX,MAX), + (1152921504606912512,MIN,MIN,MIN ; 1152921504606912512,MAX,MAX,MAX), (1152921504607109120,MIN,MIN,MIN ; 1152921504607109120,MAX,MAX,MAX), (1152921504607895552, + MIN,MIN,MIN ; 1152921504607895552,MAX,MAX,MAX), (1152921504611041280,MIN,MIN,MIN ; 1152921504611041280,MAX,MAX,MAX), (1152921504623624192,MIN,MIN,MIN ; + 1152921504623624192,MAX,MAX,MAX), (1152921504673955840,MIN,MIN,MIN ; 1152921504673955840,MAX,MAX,MAX), (1152921504875282432,MIN,MIN,MIN ; 1152921504875282432, + MAX,MAX,MAX), (1152921505680588800,MIN,MIN,MIN ; 1152921505680588800,MAX,MAX,MAX), (1152921508901814272,MIN,MIN,MIN ; 1152921508901814272,MAX,MAX,MAX), + (1152921521786716160,MIN,MIN,MIN ; 1152921521786716160,MAX,MAX,MAX), (1152921573326323712,MIN,MIN,MIN ; 1152921573326323712,MAX,MAX,MAX), (1152921779484753920, + MIN,MIN,MIN ; 1152921779484753920,MAX,MAX,MAX), (1152922604118474752,MIN,MIN,MIN ; 1152922604118474752,MAX,MAX,MAX), (1152925902653358080,MIN,MIN,MIN ; + 1152925902653358080,MAX,MAX,MAX), (1152939096792891392,MIN,MIN,MIN ; 1152939096792891392,MAX,MAX,MAX), (1152991873351024640,MIN,MIN,MIN ; 1152991873351024640, + MAX,MAX,MAX), (1153202979583557632,MIN,MIN,MIN ; 1153202979583557632,MAX,MAX,MAX), (1154047404513689600,MIN,MIN,MIN ; 1154047404513689600,MAX,MAX,MAX), + (1157425104234217472,MIN,MIN,MIN ; 1157425104234217472,MAX,MAX,MAX), (1170935903116328960,MIN,MIN,MIN ; 1170935903116328960,MAX,MAX,MAX), (1224979098644774912, + MIN,MIN,MIN ; 1224979098644774912,MAX,MAX,MAX), (1441151880758558720,MIN,MIN,MIN ; 1441151880758558720,MAX,MAX,MAX), (1152921504606846976,MIN,MIN,MIN ; + 1152921504606846976,MAX,MAX,MAX), (1152921504606846977,MIN,MIN,MIN ; 1152921504606846977,MAX,MAX,MAX) +select id, st_astext(geom) from group_change_info where city_code = 10 and change_status in ('INIT', 'PROCESSING', 'SUCCESS', 'DIFF_NG') +and change_date != '2023-06-06 00:00:00' and st_intersects(geom, st_geomfromtext('point(1 1)', 0)); +id st_astext(geom) +1 POINT(1 1) +explain select id, st_astext(geom) from group_change_info where city_code = 10 and change_status in ('INIT', 'PROCESSING', 'SUCCESS', 'DIFF_NG') +and st_intersects(geom, st_geomfromtext('point(1 1)', 0)) and change_date != '2023-06-06 00:00:00'; +Query Plan +====================================================================== +|ID|OPERATOR |NAME |EST.ROWS|EST.TIME(us)| +---------------------------------------------------------------------- +|0 |TABLE FULL SCAN|group_change_info(idx_geom)|1 |136 | +====================================================================== +Outputs & filters: +------------------------------------- + 0 - output([group_change_info.id], [st_astext(group_change_info.geom)]), filter([group_change_info.city_code = 10], [group_change_info.change_date != + INTERNAL_FUNCTION('2023-06-06 00:00:00', 116, 17)], [st_intersects(group_change_info.geom, st_geomfromtext('point(1 1)', 0))], [group_change_info.change_status + IN ('INIT', 'PROCESSING', 'SUCCESS', 'DIFF_NG')]) + access([group_change_info.id], [group_change_info.city_code], [group_change_info.geom], [group_change_info.change_status], [group_change_info.change_date]), partitions(p0) + is_index_back=true, is_global_index=false, filter_before_indexback[true,false,false,false], + range_key([group_change_info.__cellid_17], [group_change_info.__mbr_17], [group_change_info.id], [group_change_info.city_code]), range(1152921504606846980, + MIN,MIN,MIN ; 1152921504606846980,MAX,MAX,MAX), (1152921504606846992,MIN,MIN,MIN ; 1152921504606846992,MAX,MAX,MAX), (1152921504606847040,MIN,MIN,MIN ; + 1152921504606847040,MAX,MAX,MAX), (1152921504606847232,MIN,MIN,MIN ; 1152921504606847232,MAX,MAX,MAX), (1152921504606848000,MIN,MIN,MIN ; 1152921504606848000, + MAX,MAX,MAX), (1152921504606851072,MIN,MIN,MIN ; 1152921504606851072,MAX,MAX,MAX), (1152921504606863360,MIN,MIN,MIN ; 1152921504606863360,MAX,MAX,MAX), + (1152921504606912512,MIN,MIN,MIN ; 1152921504606912512,MAX,MAX,MAX), (1152921504607109120,MIN,MIN,MIN ; 1152921504607109120,MAX,MAX,MAX), (1152921504607895552, + MIN,MIN,MIN ; 1152921504607895552,MAX,MAX,MAX), (1152921504611041280,MIN,MIN,MIN ; 1152921504611041280,MAX,MAX,MAX), (1152921504623624192,MIN,MIN,MIN ; + 1152921504623624192,MAX,MAX,MAX), (1152921504673955840,MIN,MIN,MIN ; 1152921504673955840,MAX,MAX,MAX), (1152921504875282432,MIN,MIN,MIN ; 1152921504875282432, + MAX,MAX,MAX), (1152921505680588800,MIN,MIN,MIN ; 1152921505680588800,MAX,MAX,MAX), (1152921508901814272,MIN,MIN,MIN ; 1152921508901814272,MAX,MAX,MAX), + (1152921521786716160,MIN,MIN,MIN ; 1152921521786716160,MAX,MAX,MAX), (1152921573326323712,MIN,MIN,MIN ; 1152921573326323712,MAX,MAX,MAX), (1152921779484753920, + MIN,MIN,MIN ; 1152921779484753920,MAX,MAX,MAX), (1152922604118474752,MIN,MIN,MIN ; 1152922604118474752,MAX,MAX,MAX), (1152925902653358080,MIN,MIN,MIN ; + 1152925902653358080,MAX,MAX,MAX), (1152939096792891392,MIN,MIN,MIN ; 1152939096792891392,MAX,MAX,MAX), (1152991873351024640,MIN,MIN,MIN ; 1152991873351024640, + MAX,MAX,MAX), (1153202979583557632,MIN,MIN,MIN ; 1153202979583557632,MAX,MAX,MAX), (1154047404513689600,MIN,MIN,MIN ; 1154047404513689600,MAX,MAX,MAX), + (1157425104234217472,MIN,MIN,MIN ; 1157425104234217472,MAX,MAX,MAX), (1170935903116328960,MIN,MIN,MIN ; 1170935903116328960,MAX,MAX,MAX), (1224979098644774912, + MIN,MIN,MIN ; 1224979098644774912,MAX,MAX,MAX), (1441151880758558720,MIN,MIN,MIN ; 1441151880758558720,MAX,MAX,MAX), (1152921504606846976,MIN,MIN,MIN ; + 1152921504606846976,MAX,MAX,MAX), (1152921504606846977,MIN,MIN,MIN ; 1152921504606846977,MAX,MAX,MAX) +select id, st_astext(geom) from group_change_info where city_code = 10 and change_status in ('INIT', 'PROCESSING', 'SUCCESS', 'DIFF_NG') +and st_intersects(geom, st_geomfromtext('point(1 1)', 0)) and change_date != '2023-06-06 00:00:00'; +id st_astext(geom) +1 POINT(1 1) +drop table group_change_info; diff --git a/tools/deploy/mysql_test/test_suite/geometry/t/geometry_partition_table_mysql.test b/tools/deploy/mysql_test/test_suite/geometry/t/geometry_partition_table_mysql.test index 09b0f81df..a1ba09cfe 100644 --- a/tools/deploy/mysql_test/test_suite/geometry/t/geometry_partition_table_mysql.test +++ b/tools/deploy/mysql_test/test_suite/geometry/t/geometry_partition_table_mysql.test @@ -127,3 +127,58 @@ select /*+index(partition_t1 idx)*/ st_astext(g) from partition_t1 where st_inte create spatial index idx on partition_t1 (g) local; select /*+index(partition_t1 idx)*/ st_astext(g) from partition_t1 where st_intersects(g, st_geomfromtext('point(1 1)')); drop table partition_t1; + +create table ptgeom1(c1 int, g geometry not null srid 0, g1 geometry not null srid 0) partition by hash(c1) partitions 3; +insert into ptgeom1 values (0, st_geomfromtext('point(1 1)'), st_geomfromtext('point(2 2)')); +insert into ptgeom1 values (1, st_geomfromtext('point(1 0)'), st_geomfromtext('point(2 2)')); +select st_astext(g) from ptgeom1 where st_intersects(g, st_geomfromtext('point(1 1)')); +create index pgidx1 on ptgeom1(g) local; +explain select /*+index(ptgeom1 pgidx1)*/ st_astext(g) from ptgeom1 where st_intersects(g, st_geomfromtext('point(1 1)')); +select /*+index(ptgeom1 pgidx1)*/ st_astext(g) from ptgeom1 where st_intersects(g, st_geomfromtext('point(1 1)')); +drop table ptgeom1; + +--disable_warnings + DROP TABLE IF EXISTS group_change_info; +--enable_warnings +create table group_change_info( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', + `geom` geometry NOT NULL /*!80003 SRID 0 */, + `city_code` int(11) NOT NULL COMMENT '分区分表key', + `change_status` varchar(32) NOT NULL COMMENT '变化状态: ● INIT 初始\n● PROCESSING 进入产线\n● SUCCESS 产线变更完成\n● MTL_NG 采集NG\n● DELETE 删除\n● INTERCEPT 已拦截\n● DIFF_NG 差分NG', + `change_date` datetime NOT NULL COMMENT '变化时间,本来带的属性', + PRIMARY KEY (`id`, `city_code`), + SPATIAL KEY `idx_geom` (`geom`) BLOCK_SIZE 16384 LOCAL COMMENT '变化范围' +) partition by list(city_code) (partition `p10` values in (10), partition `p20` values in (20)); + +insert into group_change_info values(1, st_geomfromtext('point(1 1)', 0), 10, 'SUCCESS', '2023-06-07 00:00:00'), + (2, st_geomfromtext('point(1 0)', 0), 10, 'SUCCESS', '2023-06-07 00:00:00'), + (3, st_geomfromtext('point(1 1)', 0), 10, 'DELETE', '2023-06-07 00:00:00'), + (4, st_geomfromtext('point(1 1)', 0), 20, 'SUCCESS', '2023-06-07 00:00:00'), + (5, st_geomfromtext('point(1 1)', 0), 10, 'SUCCESS', '2023-06-06 00:00:00'); + +explain select id, st_astext(geom) from group_change_info where st_intersects(geom, st_geomfromtext('point(1 1)', 0)) and city_code = 10 + and change_status in ('INIT', 'PROCESSING', 'SUCCESS', 'DIFF_NG') and change_date != '2023-06-06 00:00:00'; + +select id, st_astext(geom) from group_change_info where st_intersects(geom, st_geomfromtext('point(1 1)', 0)) and city_code = 10 + and change_status in ('INIT', 'PROCESSING', 'SUCCESS', 'DIFF_NG') and change_date != '2023-06-06 00:00:00'; + +explain select id, st_astext(geom) from group_change_info where city_code = 10 and st_intersects(geom, st_geomfromtext('point(1 1)', 0)) + and change_status in ('INIT', 'PROCESSING', 'SUCCESS', 'DIFF_NG') and change_date != '2023-06-06 00:00:00'; + +select id, st_astext(geom) from group_change_info where city_code = 10 and st_intersects(geom, st_geomfromtext('point(1 1)', 0)) + and change_status in ('INIT', 'PROCESSING', 'SUCCESS', 'DIFF_NG') and change_date != '2023-06-06 00:00:00'; + +explain select id, st_astext(geom) from group_change_info where city_code = 10 and change_status in ('INIT', 'PROCESSING', 'SUCCESS', 'DIFF_NG') + and change_date != '2023-06-06 00:00:00' and st_intersects(geom, st_geomfromtext('point(1 1)', 0)); + +select id, st_astext(geom) from group_change_info where city_code = 10 and change_status in ('INIT', 'PROCESSING', 'SUCCESS', 'DIFF_NG') + and change_date != '2023-06-06 00:00:00' and st_intersects(geom, st_geomfromtext('point(1 1)', 0)); + +explain select id, st_astext(geom) from group_change_info where city_code = 10 and change_status in ('INIT', 'PROCESSING', 'SUCCESS', 'DIFF_NG') + and st_intersects(geom, st_geomfromtext('point(1 1)', 0)) and change_date != '2023-06-06 00:00:00'; + +select id, st_astext(geom) from group_change_info where city_code = 10 and change_status in ('INIT', 'PROCESSING', 'SUCCESS', 'DIFF_NG') + and st_intersects(geom, st_geomfromtext('point(1 1)', 0)) and change_date != '2023-06-06 00:00:00'; + + +drop table group_change_info;