近期,腾讯云云原生数据库TDSQL-C再升级,自主研发并上线并行查询功能,计算性能大幅提升,在面对大数据量表单与复杂SQL语句时,查询时间大幅缩短,加速比最高可达1000%+。
并行查询功能是TDSQL-C当前版本在计算层实现的最为重要且复杂的能力,不仅需要对计算层进行改造,同时在优化器、参数设置、监控项等方面进行了适配,具备零成本性能提升、透明级流程监控、常用语句全面支持和灵活参数设置等功能优势。
让您的查询快起来
当前TDSQL-C MySQL版的并行查询能力支持 实例CPU数4核及以上且数据库版本为MySQL8.0版本的实例 免费开通使用,通过控制台参数设置,调整当前实例的最大线程数(txsql_max_parallel_worker_threads)和并行度参数(txsql_parallel_degree)不为0即可开启使用。无需进行额外消费即可充分调动您的实例 CPU 计算能力,提高语句响应速度,计算性能大幅提升,让您的业务效率成倍上升!
● txsql_parallel_degree 参数的数值表明单条语句并行查询使用的最大线程数,即并行查询的默认并行度,建议并行度不要超过实例 CPU 核数的二分之一。为保证稳定性,CPU 核数小于4的小规格集群将禁用并行查询功能,您将无法在控制台或使用命令行调整并行查询相关参数。
● SQL 语句在执行并行查询时将默认使用 txsql_parallel_degree 所设置的并行度,但用户可通过 hint 语句调整单条 SQL 语句的并行查询并行度。
● txsql_max_parallel_worker_threads 参数的值表明并行查询中实例可用于并行查询的线程数,txsql_max_parallel_worker_threads / txsql_parallel_degree 的值表明最多同时有多少条 SQL 语句可以执行并行查询。
开启后,数据库将自动判断所使用的查询语句是否符合并行查询条件,若符合条件将自动使用该能力,加速查询,无需输入额外命令语句,极简使用体验。
当前版本并行查询的实现基于worker- gather模式,利用实例的多核优势,对查询进行拆分,用户线程会进行数据划分和任务分拆,同时充当协调者角色,协调多个工作线程并行地执行子任务。用户线程收到 SQL 后,经解析、校验和优化等常规步骤,产生串行执行计划(迭代算子树),但同时搜集优化过程依赖的各种信息(优化环境),然后分析串行执行计划(语句检测,实际上是检测算子树、执行环境和优化代价),决定是否启动并行优化。并行优化时将串行算子树划分成粗粒度任务,选定并行表(动态分区)和任务间数据交换算法,并构造任务依赖图。此时,用户线程准备就绪,从可用线程管理器里申请到足够的工作线程,就可以开始调度执行。
基于上述理论,并行查询功能将充分利用您的CPU资源加速语句的执行,经测试验证,开启并行查询能力后,在面对大数据量表单与复杂SQL语句时,查询时间大幅缩短,加速比最高可达1000%+。
让流程更加透明
TDSQL-C MySQL版提供多种监控手段对并行查询过程进行监控,保证每个异常状态均可实时掌握,保护集群稳定运行。
由于并行查询是腾讯云自研的能力,MySQL原生自带的命令行与监控项无法很好的对整个执行流程的全貌进行查看。为此TDSQL-C MySQL版新增多项监控变量与定制化SQL命令,方便用户在使用并行查询能力时可以精准查看执行流程与工作线程,遇到特殊情况时可以快速处理。
TDSQL-C MySQL版为并行查询能力设置了四项监控指标:
● 当前并行查询线程数:并行查询当前使用的线程数量。
● 并行查询错误数:并行查询报错的语句数量。
● 已执行并行查询数:已执行的并行查询语句数量。
● 回滚串行查询数:并行查询回滚到串行查询的语句数量。
从执行到报错以及回滚三个环节全方位量化监控,每个场景均能轻松应对,在执行流程中,我们同样定制了并行查询专用命令语句,支持查看并行查询的执行计划,以及查看线程中哪些线程在执行并行查询计划。您可清晰了解到并行查询是如何在数据库中稳定生效,也可在并行查询执行过程中遇到问题时,帮助快速定位问题。
下面为您介绍查看并行查询执行过程的两种常用语法。
示例 SQL 语句:
树状执行计划打印结果:
EXPLAIN: -> Sort: lineitem.L_RETURNFLAG, lineitem.L_LINESTATUS-> Table scan on <temporary>-> Final Aggregate using temporary table-> PX Receiver (slice: 0; workers: 1)-> PX Sender (slice: 1; workers: 4)-> Table scan on <temporary>-> Aggregate using temporary table-> Filter: (lineitem.L_SHIPDATE <= DATE'1998-09-02') (cost=65449341.10 rows=296592240)-> Parallel table scan on lineitem (cost=65449341.10 rows=593184480)1 row in set (0.00 sec)
● 由上述结果可以看出:并行查询计划将语句分布给了4个工作线程进行运算。
● 将聚合运算拆分为了上下段,用户线程和并行线程分别执行。
● 对 lineitem 表采用了并行扫描算子。
explain语句详细展示了并行查询的执行流程
show processlist 命令的输出结果显示了有哪些线程在运行,不仅可以查看当前所有的连接数,还可以查看当前的连接状态帮助识别出有问题的查询语句等。
基于 show processlist 命令,TDSQL-C MySQL 版自研了 show parallel processlist 语句,帮助您过滤线程中非并行查询的线程,使用该命令行后,将只展示与并行查询有关的线程。
mysql> show parallel processlist;+--------+-------------+-----------+----------+---------+------+-------------+------------------------------------------------------------------------------------------------------+| Id | User | Host | db | Command | Time | State | Info |+--------+-------------+-----------+----------+---------+------+-------------+------------------------------------------------------------------------------------------------------+| 237062 | tencentroot | localhost | tpch100g | Query | 18 | Scheduling | SELECT l_returnflag, l_linestatus, sum(l_quantity) as sum_qty FROM lineitem WHERE l_shipdate <= '199 || 237110 | | | | Task | 18 | Task runing | connection 237062, worker 0, task 1 || 237111 | | | | Task | 18 | Task runing | connection 237062, worker 1, task 1 || 237112 | | | | Task | 18 | Task runing | connection 237062, worker 2, task 1 || 237113 | | | | Task | 18 | Task runing | connection 237062, worker 3, task 1 |+--------+-------------+-----------+----------+---------+------+-------------+------------------------------------------------------------------------------------------------------+5 rows in set (0.00 sec)
由上述结果可以看出:
● 上述查询由并行计划分布给四个 work 线程进行执行:user 仅有一行有显示,表明 ID 237062 为用户线程,将 SQL 语句执行计划下推至下面四个 work 线程中进行,通过 info 列可看到,这四个工作线程均在执行 task1。
● 每个线程均可查询出来,精准进行定位。
● show parallel processlist 相较于 show processlist 可以精准查询到所有进行并行查询的线程,不被其余线程影响。
对语句更多支持
TDSQL-C MySQL 版已经实现了具备如下特征的 SQL 语句的并行查询处理,并在逐渐完善更多的功能场景。
● 对于单表扫描:支持全表扫描、索引扫描、索引范围扫描、索引 REF 查询等扫描类型的正序、逆序扫描。
● 对于多表连接:支持 Nested Loop Join 算法以及 Semi Join、Anti Join、Outer Join 等连接类型。
● 对于子查询:支持 derived table 的并行。
● 对于数据类型:支持带多种数据类型的查询,包括整型数据、字符型数据、浮点型数据、时间类型数据、以及(有运行时大小限制的)溢出类型数据。
● 普通运算符和函数原则上不限。
● 聚合函数支持 COUNT/SUM/AVG/MIN/MAX。
● 支持 UNION/UNION ALL 查询。
● 支持 traditional(默认格式)、json 和 tree 三种 EXPLAIN 格式。
测试表明,现已支持的语句,TDSQL-C MySQL版开启并行查询后相较于MySQL传统的串行查询,查询时间平均缩短十倍以上。
让执行更加灵活
为了适应多种业务情况,以及保证并行查询能力不会对硬件产生过多的负载,TDSQL-C MySQL 版也提供了多种策略对并行查询的执行条件进行设置,方便您对业务进行个性化适配,保证业务稳定运行。设置后,TDSQL-C MySQL 版将会对语句的执行代价、表的行数、单条语句执行并行计划时所使用的内存等条件进行判断,确认每一条 SQL 语句是否允许执行并行查询。
当前版本支持通过对如下参数进行调整,来控制对并行查询的执行:
● txsql_parallel_cost_threshold:并行执行代价阈值,只有执行代价高于阈值的语句才会进行并行查询。对该项策略进行设置,可以防止过于简单的查询进入并行查询队列,占用真的需要并行查询能力的SQL语句的资源。
● txsql_parallel_table_record_threshold:并行表行数阈值,只有行数高于阈值的表才能被选为并行表。该项策略同样为了防止数据量不大的表单执行并行查询占用用资源,影响复杂语句的效率。
● txsql_optimizer_context_max_mem_size:单条语句可申请的并行查询计划环境最大内存限制。
● txsql_parallel_execution_max_lob_size:单个溢出字段的内存限制。
除使用控制策略来对并行查询的执行进行调整外,TDSQL-C MySQL版同样提供了hint语句帮助用户进行session级控制,可以做到对单条语句指定并行执行方式,从而避免为单条语句的执行而修改整个集群的参数设置。
例如:
1、无论系统默认并行度数值为多少,强制该条语句使用并行度为4执行并行查询,设置该条语句的 txsql_parallel_degree = 4 ,可以使用下面的hint语句实现:
select /+PARALLEL(4)/ * FROM t1,t2;
2、选择 t1 表执行并行查询,并行度为8,可以使用下面的hint语句实现:
select /+PARALLEL(t1 8)/ * FROM t1,t2;
3、设置该条语句的 txsql_parallel_cost_threshold=1000,当该条语句的执行代价大于1000时,即可使用并行查询,可以使用下面的hint语句实现:
select /+SET_VAR(txsql_parallel_cost_threshold=1000)/ * FROM t1,t2
TDSQL-C MySQL版通过以上功能优势将并行查询能力的易用性与灵活性进一步提升,方便用户适配各种业务环境,灵活调用硬件负载。TDSQL-C MySQL版作为腾讯云自研的新一代云原生关系型数据库,融合了传统数据库、云计算与新硬件技术的优势,为用户提供具备极致弹性、高性能、海量存储、安全可靠的数据库服务,并将持续在并行查询能力这一企业级查询加速特性上探索更多可能性,为用户的业务带来更强有力的支持。
﹀
﹀
﹀
-- 更多精彩 --
↓↓点击阅读原文,即可免费体验!