华为云用户手册

  • 语法 创建一个或多个RANGE-LIST分区表,其中每个分区可能有一个或一个以上的子分区。 CREATE TABLE ... PARTITION BY RANGE {(expr) | COLUMNS(column_list)} SUBPARTITION BY LIST {(expr) | COLUMNS(column_list)} [(partition_definition [, partition_definition] ...)]; 其中,partition_definition为: PARTITION partition_name VALUES LESS THAN {(value | value_list) | MAXVALUE} [(subpartition_definition [, subpartition_definition] ...)] subpartition_definition为: SUBPARTITION subpartition_name VALUES IN {(value | value_list)} 表1 参数说明 参数名称 描述 expr 分区字段表达式。目前只支持INT类型,不支持字符类型。 column_list RANGE COLUMNS的情况下使用。分区字段列表,不支持表达式,可以支持多列。 value 分区边界值。 value_list RANGE COLUMNS的情况下使用,多个字段的边界值。 MAXVALUE 最大值。 partition_name 分区名称,同一个表中不可重复。 subpartition_name 子分区名称, 同一个表中不可重复。
  • 使用示例 RANGE-LIST类型的使用示例 CREATE TABLE tbl_range_list (col1 INT, col2 INT, col3 varchar(20)) PARTITION BY RANGE(col1) SUBPARTITION BY LIST(col2) ( PARTITION m1 VALUES LESS THAN(1000) ( SUBPARTITION p0 VALUES in (1, 2), SUBPARTITION p1 VALUES in (3, 4), SUBPARTITION p2 VALUES in (5, 6) ), PARTITION m2 VALUES LESS THAN(2000) ( SUBPARTITION p3 VALUES in (1, 2), SUBPARTITION p4 VALUES in (3, 4), SUBPARTITION p5 VALUES in (5, 6) ), PARTITION m3 VALUES LESS THAN(MAXVALUE) ( SUBPARTITION p6 VALUES in (1, 2), SUBPARTITION p7 VALUES in (3, 4), SUBPARTITION p8 VALUES in (5, 6) ) ); RANGE COLUMNS-LIST类型的使用示例 CREATE TABLE tbl_range_columns_list ( col1 INT, col2 INT, col3 varchar(20), col4 DATE ) PARTITION BY RANGE COLUMNS(col4) SUBPARTITION BY LIST(col1) ( PARTITION dp1 VALUES LESS THAN('2023-01-01')( SUBPARTITION p0 VALUES in (1, 2), SUBPARTITION p1 VALUES in (3, 4), SUBPARTITION p2 VALUES in (5, 6) ), PARTITION dp2 VALUES LESS THAN('2024-01-01')( SUBPARTITION p3 VALUES in (1, 2), SUBPARTITION p4 VALUES in (3, 4), SUBPARTITION p5 VALUES in (5, 6) ), PARTITION dp3 VALUES LESS THAN('2025-01-01')( SUBPARTITION p6 VALUES in (1, 2), SUBPARTITION p7 VALUES in (3, 4), SUBPARTITION p8 VALUES in (5, 6) ) );
  • 语法 创建一个或多个RANGE-RANGE分区表,其中每个分区可能有一个或一个以上的RANGE类型的子分区。 CREATE TABLE ... PARTITION BY RANGE {(expr) | COLUMNS(column_list)} SUBPARTITION BY RANGE {(expr) | COLUMNS(column_list)} [(partition_definition [, partition_definition] ...)]; 其中,partition_definition为: PARTITION partition_name VALUES LESS THAN {(value | MAXVALUE | value_list) | MAXVALUE} [(subpartition_definition [, subpartition_definition] ...)] subpartition_definition为: SUBPARTITION subpartition_name VALUES LESS THAN {value | value_list | MAXVALUE} 表1 参数说明 参数名称 描述 expr 分区字段表达式。目前只支持INT类型,不支持字符类型。 column_list RANGE COLUMNS的情况下使用。分区字段列表,不支持表达式,可以支持多列。 value 分区边界值。 value_list RANGE COLUMNS的情况下使用,多个字段的边界值。 MAXVALUE 最大值。 partition_name 分区名称,同一个表中不可重复。 subpartition_name 子分区名称, 同一个表中不可重复。
  • 使用示例 RANGE-RANGE类型的使用示例 CREATE TABLE tbl_range_range (col1 INT, col2 INT, col3 varchar(20)) PARTITION BY RANGE(col1) SUBPARTITION BY RANGE(col2) ( PARTITION p0 VALUES LESS THAN (1000) ( SUBPARTITION s0 VALUES LESS THAN(100), SUBPARTITION s1 VALUES LESS THAN(MAXVALUE) ), PARTITION p1 VALUES LESS THAN (2000) ( SUBPARTITION s2 VALUES LESS THAN(100), SUBPARTITION s3 VALUES LESS THAN(200) ), PARTITION p2 VALUES LESS THAN (MAXVALUE) ( SUBPARTITION s4 VALUES LESS THAN(200), SUBPARTITION s5 VALUES LESS THAN(400) ) ); RANGE COLUMNS-RANGE类型的使用示例 CREATE TABLE tbl_range_col_range (col1 INT, col2 INT, col3 INT) PARTITION BY RANGE COLUMNS(col1, col2) SUBPARTITION BY RANGE(col3) ( PARTITION p1 VALUES LESS THAN(1000, MAXVALUE)( SUBPARTITION s0 VALUES LESS THAN(100), SUBPARTITION s1 VALUES LESS THAN(MAXVALUE) ), PARTITION p2 VALUES LESS THAN(2000, MAXVALUE)( SUBPARTITION s2 VALUES LESS THAN(100), SUBPARTITION s3 VALUES LESS THAN(200) ), PARTITION p3 VALUES LESS THAN(MAXVALUE, MAXVALUE)( SUBPARTITION s4 VALUES LESS THAN(200), SUBPARTITION s5 VALUES LESS THAN(400) ) );
  • 功能介绍 TaurusDB分区表完全兼容社区MySQL的语法和功能。同时,TaurusDB分区表相对于社区MySQL进行了功能增强,支持丰富的分区表类型及组合,使您可以更加便携、简单和高效的使用分区表。 TaurusDB兼容的社区MySQL分区表类型如下: HASH KEY RANGE LIST RANGE-HASH RANGE-KEY LIST-HASH LIST-KEY 组合分区由一级分区(主分区)和二级分区(子分区)组成。 TaurusDB组合分区功能支持的分区表类型如下: RANGE-RANGE RANGE-LIST LIST-RANGE LIST-LIST HASH-HASH HASH-KEY HASH-RANGE HASH-LIST KEY-KEY KEY-HASH KEY-RANGE KEY-LIST 父主题: 二级分区
  • 开启多表连接DISTINCT优化 表1 参数说明 参数名称 级别 描述 rds_nlj_distinct_optimize Global,Session DISTINCT优化特性开关,默认值为OFF。 ON:开启DISTINCT优化特性。 OFF:关闭DISTINCT优化特性。 除了使用上述开关来控制优化特性生效或者不生效,还可以使用HINT来实现,语法如下。 开启DISTINCT优化特性 /*+ SET_VAR(rds_nlj_distinct_optimize=ON) */ 关闭 DISTINCT 优化特性 /*+ SET_VAR(rds_nlj_distinct_optimize=OFF) */
  • 性能测试 TaurusDB执行耗时2.7秒完成,只需要扫描约61万行数据。相比MySQL 8.0 社区版本执行耗时约186秒,扫描数据量4400万,执行效率大大提升。 如下示例中,对7个表连接后的结果做DISTINCT,使用MySQL 8.0.30社区版本,执行耗时186秒,扫描了约4400万行数据。 TaurusDB执行耗时2.7秒,扫描约61万行数据。 查询语句: select distinct ed.code,et.* from ele_template et left join ele_template_tenant ett on ett.template_id = et.id left join ele_relation tm on tm.tom_id = et.id and tm.jerry_type = 'chapter' left join ele_relation mv on mv.tom_id = tm.jerry_id and mv.jerry_type = 'variable' left join ele_relation cv on cv.jerry_id = mv.jerry_id and cv.tom_type = 'column' left join ele_doc_column edc on edc.id = cv.tom_id left join ele_doc ed on ed.id = edc.doc_id where ett.uctenantid = 'mmo0l3f8' and ed.code = 'contract' and et.billtype = 'contract' order by ifnull(et.utime,et.ctime) desc limit 0,10;
  • 性能测试 使用sysbench模型测试。 准备1000w数据。 sysbench /usr/share/sysbench/oltp_read_only.lua --tables=1 --report-interval=10 --table-size=10000000 --mysql-user=root --mysql-password=123456 --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-db=sbtest --time=300 --max-requests=0 --threads=200 prepare 查询带1万个IN。 select count(*) from sbtest1 where id/k in (... ...); 性能对比如下表所示: 表1 性能数据 测试方法 开启转换 关闭转换(不适用range_opt) 性能对比 带索引 0.09 2.48 提升26.5倍 父主题: IN谓词转子查询
  • 功能介绍 社区MySQL的LIMIT(N)/OFFSET(P)的SELECT语句,引擎层返回所有满足WHERE条件的行给SQL层处理,SQL丢弃OFFSET对应的P行,返回N行数据。当查询二级索引需要访问主表列的时候,引擎层还会先返回表获取所有需要的列信息。对于OFFSET的P远大于LIMIT的N的时候,将会导致引擎层反馈大量的数据到SQL层处理。 TaurusDB提供的LIMIT OFFSET下推功能是把LIMIT OFFSET下推到引擎层处理,提升查询效率。 父主题: LIMIT OFFSET下推
  • Statement Outline表介绍 TaurusDB内置了一个系统表(outline)保存Hint,系统启动时会自动创建该表,无需您手动创建。创建表的SQL语句如下: CREATE TABLE `mysql`.`outline` ( `Id` bigint(20) NOT NULL AUTO_INCREMENT, `Schema_name` varchar(64) COLLATE utf8_bin DEFAULT NULL, `Digest` varchar(64) COLLATE utf8_bin NOT NULL, `Digest_text` longtext COLLATE utf8_bin, `Type` enum('IGNORE INDEX','USE INDEX','FORCE INDEX','OPTIMIZER') CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, `Scope` enum('','FOR JOIN','FOR ORDER BY','FOR GROUP BY') CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT '', `State` enum('N','Y') CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT 'Y', `Position` bigint(20) NOT NULL, `Hint` text COLLATE utf8_bin NOT NULL, PRIMARY KEY (`Id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin STATS_PERSISTENT=0 COMMENT='Statement outline'
  • 开启BackwardIndexScan 表1 参数说明 参数名称 级别 描述 optimizer_switch Global,Session 查询优化的总控制开关。 其中,BackwardIndexScan子控制开关为backward_index_scan,控制是否能使用BackwardIndexScan特性,默认值为ON。 ON:优化器能选用BackwardIndexScan。 OFF:优化器不能选用BackwardIndexScan。 除了使用上述开关来控制BackwardIndexScan特性,还可以使用HINT来实现,语法如下。 在SQL语句执行期间开启Backward Index Scan特性 /*+ set_var(optimizer_switch='backward_index_scan=on') */ : 在SQL语句执行期间关闭Backward Index Scan特性 /*+ set_var(optimizer_switch='backward_index_scan=off') */ :
  • 功能介绍 该特性默认打开,当表在创建索引的时候,通过查询INFORMATION_SCHEMA.INNODB_ALTER_TABLE_PROGRESS这个表的信息可以获取当前进度,表结构如下: 图1 表结构 THREAD_ID为线程ID。 QUERY是指客户端下发的创建index语句。 START_TIME为创建index命令下发时间。 ELAPSED_TIME是指已经用了多少时间。 ALTER_TABLE_PHASE是指当前到哪个阶段了。 WORK_COMPLETED是指当前已经完成的工作量。 WORK_ESTIMATED是指整个创建index流程一共多少工作量的估计值。 TIME_REQUIRED是预计还需要多长时间。 WORK_ESTIMATED和TIME_REQUIRED会随着index创建的进行,一直调整,所以不是并非线性变化。
  • 使用示例 执行如下SQL查询目标表结构。 desc table_name; 例如: 查询表test_stage的结构。 desc test_stage; 图2 查看表结构 从上述表结构中可以看出,表test_stage中不存在二级索引。 执行如下SQL,为目标表的某一列增加索引。 ALTER TABLE table_name ADD INDEX idxa(field_name); 例如: 对test_stage表的a列增加索引。 ALTER TABLE test_stage ADD INDEX idxa(a); 执行如下SQL查询创建索引的进度。 SELECT QUERY, ALTER_TABLE_PHASE FROM INFORMATION_SCHEMA.INNODB_ALTER_TABLE_PROGRESS; 图3 查询创建索引的进度
  • 参数说明 您可以先使用“rds_nonblock_ddl_enable”参数开启非阻塞DDL功能,然后通过“rds_nonblock_ddl_retry_times”参数设置获取MDL-X锁超时重试的次数,“rds_nonblock_ddl_retry_interval”参数设置获取MDL-X锁超时重试的时间间隔,“rds_nonblock_ddl_lock_wait_timeout”参数设置获取MDL-X锁超时的时间。
  • 使用方法 使用SysBench创建1个测试表sbtest1, 并插入1000000行数据。 ./oltp_read_write.lua --mysql-host="集群地址" --mysql-port="端口号" --mysql-user="用户名" --mysql-password="用户密码" --mysql-db="sbtest" --tables=1 --table-size=1000000 --report-interval=1 --percentile=99 --threads=8 --time=6000 prepare 通过SysBench中的oltp_read_write.lua模拟用户业务。 ./oltp_read_write.lua --mysql-host="集群地址" --mysql-port="端口号" --mysql-user="用户名" --mysql-password="用户密码" --mysql-db="sbtest" --tables=1 --table-size=1000000 --report-interval=1 --percentile=99 --threads=8 --time=6000 run 在目标表sbtest1 上开启一个新事务但不提交,该事务持有目标表sbtest1的MDL锁。 begin; select * from sbtest1; 开启一个新会话,在开启和关闭非阻塞 DDL功能的条件下,分别对表sbtest1进行加列操作,观察TPS的变化情况。 alter table sbtest1 add column d int; 测试结果。 关闭非阻塞DDL, TPS持续跌零。默认超时时间为31536000秒,严重影响用户业务。 开启非阻塞DDL, TPS周期性下降,但未跌零,对用户业务影响较小。
  • 使用示例 首先开启一个客户端,执行加锁操作,示例如下。 图1 加锁操作 通过如下命令,查看DDL快速超时功能的状态。 show variables like "%rds_ddl_lock_wait_timeout%"; 图2 查看状态 如上图所示,查询到“rds_ddl_lock_wait_timeout”的值是“31536000”,此时是默认值,相当于不开启DDL快速超时功能。如果此时等锁,就会卡在这里。 如果需要开启DDL快速超时功能,可以将这个值设置为预期值,操作请参考3。 设置参数。 执行如下命令,设置“rds_ddl_lock_wait_timeout”参数值。 set rds_ddl_lock_wait_timeout=1; 图3 设置参数 然后执行如下创建索引命令,发现DDL操作会快速超时失败,符合预期。 alter table lzk.t_lzk drop index indexa; 图4 执行创建索引命令
  • 开启DDL快速超时 表1 参数说明 参数名称 级别 描述 rds_ddl_lock_wait_timeout Global,Session 控制当前会话或者全局的DDL超时时间。 时间单位为秒,范围为1秒到31536000,默认值为31536000,相当于不开启。 对于DDL的等锁超时,其真实超时时间是lock_wait_timeout和rds_ddl_lock_wait_timeout的最小值。 对于DDL过程中InnoDB层的加表锁超时(行锁不在该考虑范围),其真实超时时间是innodb_lock_wait_timeout和rds_ddl_lock_wait_timeout)的最小值。
  • 约束与限制 内核版本为2.0.45.230900及以上版本支持使用该功能。 并行创建索引功能,目前支持的索引为Btree二级索引。 不支持主键索引、spatial index和fulltext index。如果一个并行创建索引的SQL语句包含主键索引,或者spatial index和fulltext index,客户端将会收到一个告警,提示该操作不支持并行创建索引,同时该语句会采用单线程创建索引的方式执行完成。假设在修改主键索引时,虽然指定了多线程,但是会收到一个告警,实际上只能通过单线程建索引。
  • 使用示例 假设使用sysbench的表,表内有1亿条数据。 图1 查看表 在该表的“k”字段创建索引。 如图2所示,采用社区默认单线程创建索引,耗时146.82s。 图2 单线程创建创建索引 通过设置innodb_rds_parallel_index_creation_threads= 4,启用4个线程创建索引。 从图3中可以看到创建索引耗时38.72s,与社区单线程相比速度提升了3.79倍。 图3 多线程创建索引 假设要修改主键索引,虽然指定了多线程,但是会收到一个告警,实际上只能通过单线程建索引。 图4 修改主键索引
  • 工作原理 云数据库TaurusDB采用计算与存储分离的架构,以减少网络流量为主要架构准则,通过NDP设计将该准则应用到查询操作。没有NDP之前,查询处理需要将原始数据从存储节点全部传输到计算节点。通过NDP设计,查询中的I/O密集型和CPU密集型的大部分工作被下推到存储节点完成,仅将所需列及筛选后的行或聚合后的结果值回传给计算节点,使网络流量大幅减少。同时跨存储节点并行处理,使计算节点CPU使用率下降,提升了查询效率性能。 另外,NDP框架同TaurusDB并行查询进行融合,并进行了页面批量预取的设计,达成执行全流程并行,进一步提升查询执行效率。
  • 参数说明 表1 参数说明 参数名 级别 描述 ndp_mode Global、Session NDP特性开关,OFF表示特性关闭,ON表示特性在主机和只读节点开启,REPLICA_ON表示特性只在只读节点开启。 取值范围:OFF/ON/REPLICA_ON 默认取值:OFF ndp_support_features Global、Session NDP支持的特性 COUNT,是否将COUNT聚合运算通过NDP下推至存储计算 MIN,是否将MIN聚合运算通过NDP下推至存储计算 MAX,是否将MAX聚合运算通过NDP下推至存储计算 AVG,是否将AVG聚合运算通过NDP下推至存储计算 SUM,是否将SUM聚合运算通过NDP下推至存储计算 GROUP_BY,是否将GROUP BY分组相关聚合运算通过NDP下推至存储计算 Partition_Table,针对分区表,NDP下推是否生效 Instant_Column_Table,针对快速加列的表,NDP是否生效 Bloom_filter,针对Hash Join,是否将Hash Table通过NDP下推至存储提前过滤 取值范围:COUNT,MIN,MAX,AVG,SUM,GROUP_BY,Partition_Table,Instant_Column_Table,Bloom_filter 默认取值:COUNT,SUM
  • 操作步骤 生成测试数据。 请下载TPCH共用源码。 请在下载的源码文件中,找到makefile.suite文件,并按照如下内容进行修改,修改完成后进行保存。 CC = gcc # Current values for DATABASE are: INFORMIX, DB2, TDAT (Teradata) # SQLSERVER, SYBASE, ORACLE # Current values for MACHINE are: ATT, DOS, HP, IBM, ICL, MVS, # SGI, SUN, U2200, VMS, LINUX, WIN32 # Current values for WORKLOAD are: TPCH DATABASE= SQLSERVER MACHINE = LINUX WORKLOAD = TPCH 在源码根目录下,执行下列命令,编译生成TPCH数据工具dbgen。 make -f makefile.suite 使用dbgen执行如下命令,生成TPCH数据100G。 ./dbgen -s 100 登录目标TaurusDB实例,创建目标数据库,并使用如下命令创建TPCH的表。 CREATE TABLE nation ( N_NATIONKEY INTEGER NOT NULL, N_NAME CHAR(25) NOT NULL, N_REGIONKEY INTEGER NOT NULL, N_COMMENT VARCHAR(152)); CREATE TABLE region ( R_REGIONKEY INTEGER NOT NULL, R_NAME CHAR(25) NOT NULL, R_COMMENT VARCHAR(152)); CREATE TABLE part ( P_PARTKEY INTEGER NOT NULL, P_NAME VARCHAR(55) NOT NULL, P_MFGR CHAR(25) NOT NULL, P_BRAND CHAR(10) NOT NULL, P_TYPE VARCHAR(25) NOT NULL, P_SIZE INTEGER NOT NULL, P_CONTAINER CHAR(10) NOT NULL, P_RETAILPRICE DECIMAL(15,2) NOT NULL, P_COMMENT VARCHAR(23) NOT NULL ); CREATE TABLE supplier ( S_SUPPKEY INTEGER NOT NULL, S_NAME CHAR(25) NOT NULL, S_ADDRESS VARCHAR(40) NOT NULL, S_NATIONKEY INTEGER NOT NULL, S_PHONE CHAR(15) NOT NULL, S_ACCTBAL DECIMAL(15,2) NOT NULL, S_COMMENT VARCHAR(101) NOT NULL); CREATE TABLE partsupp ( PS_PARTKEY INTEGER NOT NULL, PS_SUPPKEY INTEGER NOT NULL, PS_AVAILQTY INTEGER NOT NULL, PS_SUPPLYCOST DECIMAL(15,2) NOT NULL, PS_COMMENT VARCHAR(199) NOT NULL ); CREATE TABLE customer ( C_CUSTKEY INTEGER NOT NULL, C_NAME VARCHAR(25) NOT NULL, C_ADDRESS VARCHAR(40) NOT NULL, C_NATIONKEY INTEGER NOT NULL, C_PHONE CHAR(15) NOT NULL, C_ACCTBAL DECIMAL(15,2) NOT NULL, C_MKTSEGMENT CHAR(10) NOT NULL, C_COMMENT VARCHAR(117) NOT NULL); CREATE TABLE orders ( O_ORDERKEY INTEGER NOT NULL, O_CUSTKEY INTEGER NOT NULL, O_ORDERSTATUS CHAR(1) NOT NULL, O_TOTALPRICE DECIMAL(15,2) NOT NULL, O_ORDERDATE DATE NOT NULL, O_ORDERPRIORITY CHAR(15) NOT NULL, O_CLERK CHAR(15) NOT NULL, O_SHIPPRIORITY INTEGER NOT NULL, O_COMMENT VARCHAR(79) NOT NULL); CREATE TABLE lineitem ( L_ORDERKEY INTEGER NOT NULL, L_PARTKEY INTEGER NOT NULL, L_SUPPKEY INTEGER NOT NULL, L_LINENUMBER INTEGER NOT NULL, L_QUANTITY DECIMAL(15,2) NOT NULL, L_EXTENDEDPRICE DECIMAL(15,2) NOT NULL, L_DISCOUNT DECIMAL(15,2) NOT NULL, L_TAX DECIMAL(15,2) NOT NULL, L_RETURNFLAG CHAR(1) NOT NULL, L_LINESTATUS CHAR(1) NOT NULL, L_SHIPDATE DATE NOT NULL, L_COMMITDATE DATE NOT NULL, L_RECEIPTDATE DATE NOT NULL, L_SHIPINSTRUCT CHAR(25) NOT NULL, L_SHIPMODE CHAR(10) NOT NULL, L_COMMENT VARCHAR(44) NOT NULL); 使用如下命令,将生成的数据导入到TPCH的表中。 load data INFILE '/path/customer.tbl' INTO TABLE customer FIELDS TERMINATED BY '|'; load data INFILE '/path/region.tbl' INTO TABLE region FIELDS TERMINATED BY '|'; load data INFILE '/path/nation.tbl' INTO TABLE nation FIELDS TERMINATED BY '|'; load data INFILE '/path/supplier.tbl' INTO TABLE supplier FIELDS TERMINATED BY '|'; load data INFILE '/path/part.tbl' INTO TABLE part FIELDS TERMINATED BY '|'; load data INFILE '/path/partsupp.tbl' INTO TABLE partsupp FIELDS TERMINATED BY '|'; load data INFILE '/path/orders.tbl' INTO TABLE orders FIELDS TERMINATED BY '|'; load data INFILE '/path/lineitem.tbl' INTO TABLE lineitem FIELDS TERMINATED BY '|'; 创建TPCH表的索引。 alter table region add primary key (r_regionkey); alter table nation add primary key (n_nationkey); alter table part add primary key (p_partkey); alter table supplier add primary key (s_suppkey); alter table partsupp add primary key (ps_partkey,ps_suppkey); alter table customer add primary key (c_custkey); alter table lineitem add primary key (l_orderkey,l_linenumber); alter table orders add primary key (o_orderkey); 请获取TPCH 22个查询query语句,并进行相应操作。
  • 开启并行查询 支持通过设置系统参数和使用HINT语法两种方式,开启或关闭并行查询。 方法一:通过设置系统参数开启或关闭并行查询 在管理控制台的参数修改页面,通过设置系统参数,可以全局开启或关闭并行查询,并调整并行度。 通过参数“force_parallel_execute”控制是否强制启用并行执行。 通过参数“pq_master_enable”控制主机是否开启并行查询。 通过参数“parallel_default_dop”控制使用多少线程并行执行。 通过参数“parallel_cost_threshold”来控制启动并行查询的代价阈值,默认值为1000,不建议将该值设置的过小,因为简单查询不适合使用并行查询。 上述参数在使用过程中,支持动态修改,无需重启数据库。 也支持会话内修改并行查询并发度,修改启动并行查询的代价阈值,例如将并发度调整为8,最小执行代价调整为100,可参照如下进行设置: SET parallel_default_dop=8; SET parallel_cost_threshold=100; 方法二:使用HINT开启或关闭并行查询 使用HINT语法可以控制单个语句是否进行并行执行。在系统默认关闭并行执行的情况下, 可以使用hint对特定的SQL进行开启。反之,也可以禁止某条SQL进行并行执行。 开启并行执行:采用下面的HINT语法可以开启并行执行。 采用默认的参数配置:SELECT /*+ PQ() */ … FROM … 采用默认的参数配置,同时指定并发度为8:SELECT /*+ PQ(8) */ … FROM … 采用默认的参数配置,同时指定并行表为t1:SELECT /*+ PQ(t1) */ … FROM … 采用默认的参数配置,同时指定并行表为t1,并发度为8:SELECT /*+ PQ(t1 8) */ … FROM … PQ HINT紧跟着SELECT关键字才能生效。PQ HINT的并发度参数dop正常取值范围[1, min(parallel_max_threads, 1024)]。 dop超出正常取值范围时,PQ不生效。 关闭并行执行:当并行查询开启时,可使用"NO_PQ"的hint语法关闭单条SQL的并行执行。 SELECT /*+ NO_PQ */ … FROM … NO_PQ hint的优先级高于PQ hint,如果SQL语句出现NO_PQ hint,即使配置PQ hint,该单条SQL也不会并行执行。
  • 系统参数及状态变量说明 支持的系统参数如表1。 表1 系统参数 参数名称 级别 描述 force_parallel_execute Global, Session 是否开启并行查询。当设置为“ON”时,表示查询SQL尽可能地使用并行执行;设置为“OFF”时,关闭并行查询优化。内核2.0.60.241200版本之后,支持“AUTO”选项,设置为“AUTO”系统会对默认的一些场景使用并行查询优化,对应场景是由pq_support_features_switch参数控制。 取值范围:ON, OFF, AUTO 默认值:OFF pq_master_enable Global 是否在主机开启并行查询,需要与参数force_parallel_execute配合使用,设置为“ON”时,如果force_parallel_execute为ON或AUTO,并行查询在主机生效;设置为"OFF"时,表示并行查询在主机不生效。只读节点不受该参数影响。 取值范围:ON, OFF 默认值:ON parallel_max_threads Global 并行执行的最大活跃线程个数。当并行执行的活跃线程超过该值时,新的查询将不允许启用并行执行。 取值范围:0-4294967295 默认值:64 parallel_default_dop Global, Session 并行执行的默认并行度。当查询语句没有指定并行度时,使用该值。 取值范围:0-1024 默认值:4 parallel_cost_threshold Global, Session 启用并行执行的代价阈值。只有当查询的执行代价超过该阈值时才有可能进行并行执行。 取值范围:0-4294967295 默认值:1000 parallel_queue_timeout Global, Session 当不满足并行查询的条件时,请求并行执行的SQL等待超时时间。当等待时间超过该值后,则不再等待,开始进行单线程执行。 取值范围:0-4294967295 默认值:0 parallel_memory_limit Global 并行执行可用的内存上限。当并行执行使用的内存量超过该值时,新的SQL查询将不会进行并行执行。 取值范围:0-4294967295 默认值:104857600 parallel_setup_cost Global, Session 启动初始化并行执行的代价。用于估算并行执行的总代价。 取值范围:0-1000000000 默认值:1000 parallel_tuple_cost Global, Session 并行执行消息传递单条记录的代价。用于估算并行执行的总代价。 取值范围:0-1000000 默认值:1.5 支持的状态变量如表2。 表2 状态变量 变量名 级别 描述 PQ_threads_running Global 当前正在运行的并行执行的总线程数。 PQ_memory_used Global 当前并行执行使用的总内存量。 PQ_threads_refused Global 由于总线程数限制,导致未能执行并行执行的查询总数。 PQ_memory_refused Global 由于总内存限制,导致未能执行并行执行的查询总数。
  • 应用场景 并行查询适用于大部分SELECT语句,例如大表查询、多表连接查询、计算量较大的查询。对于非常短的查询,效果不太显著。 轻分析类业务 报表查询通常SQL复杂而且比较耗费时间,通过并行查询可以加速单次查询效率。 系统资源相对空闲 并行查询会使用更多的系统资源,只有当系统的CPU较多、IO负载不高、内存够大的时候,才可以充分使用并行查询来提高资源利用率和查询效率。 数据频繁查询 针对数据密集型查询,通过并行查询,可以提高查询处理执行效率,减少网络流量和计算节点的压力。
  • 什么是并行查询 云数据库 TaurusDB支持了并行执行的查询方式,用以降低分析型查询场景的处理时间,满足企业级应用对查询低时延的要求。并行查询的基本实现原理是将查询任务进行切分并分发到多个CPU核上进行计算,充分利用CPU的多核计算资源来缩短查询时间。并行查询的性能提升倍数理论上与CPU的核数正相关,也就是说并行度越高能够使用的CPU核数就越多,性能提升的倍数也就越高。 下图是使用CPU多核资源并行计算一个表的count(*)过程的基本原理:表数据进行切块后分发给多个核进行并行计算,每个核计算部分数据得到一个中间count(*)结果,并在最后阶段将所有中间结果进行聚合得到最终结果。具体如下: 图1 并行查询原理图
  • 2.0.31.220700 表19 2.0.31.220700版本说明 日期 特性描述 2022-08-12 新特性及性能优化 支持SQL限流。 新增FasterDDL并行数限制。 支持Faster DDL的所有ROW格式。 扩展全量SQL字段。 优化流量控制。 支持ALTER TABLE快速超时。 支持Query plan cache。 备机统计信息优化。 问题修复 修复主机rename partition-table之后备机crash的问题。 修改sql tracer的默认buffer size。 修复备机truncate lsn落后很多情况下备机拉起失败的问题。 修复含有多个相同范围的SQL查询导致的执行计划错误的问题。 修复空账户导致的crash的问题。 修复drop database可能导致的crash的问题。
  • 2.0.28.9 表15 2.0.28.9版本说明 日期 特性描述 2022-09-23 修复在Condition_pushdown::replace_columns_in_cond中使用不正确的条件判断的问题。 修复递归调用存储函数之后导致数据库崩溃的问题。 修改多表删除和full-text搜索的时候导致数据库崩溃的问题; 修复运行多个窗口函数的SQL查询语句之后导致数据库崩溃的问题; 修复具有全局级别权限的用户,执行SHOW CREATE DATABASE失败的问题。
  • 2.0.28.15 表12 2.0.28.15版本说明 日期 特性描述 2023-01-11 新特性 支持SQL限流。 读流控优化。 主备执行计划一致优化。 slice异步预创建。 问题修复 修复系统变量INNODB_VALIDATE_TABLESPACE_PATHS关闭情况下undo space truncate的时候出现的crash问题。 修复查询information_schema.innodb_trx较慢问题。 修复查询结果不一致的问题:left joins没有转化为inner joins。 修复优化子查询的过程中导致的crash问题。 修复并发instantDDL和DML场景下未按实际获取instant字段值的问题。 修复当load有FTS索引的两个INNODB表时可能导致OOM的问题。 修复更新百万级别的表的数据字典可能导致OOM的问题。
  • 2.0.28.1 表18 2.0.28.1版本说明 日期 特性描述 2022-05-16 新特性 TaurusDB增加orphaned definer check控制开关。 TaurusDB支持Proxy IP透传。 Proxy提供会话一致性功能。 问题修复 修复主机DDL未提交导致的备机dd(data dictionary)未更新问题。 修复故障切换的主机的auto increment回退的问题。 修复备机性能异常问题。
共100000条
提示

您即将访问非华为云网站,请注意账号财产安全