SQL调优指南—SQL调优进阶—查询改写与下推

本文涉及的产品
云原生数据库 PolarDB 分布式版,标准版 2核8GB
简介: 下推是查询改写的一项重要优化,利用PolarDB-X的拆分信息来优化执行计划,使得算子尽量下推以达到提前过滤数据、减少网络传输、并行计算等目的。

背景信息

根据PolarDB-X的SQL语句优化的基本原则,可以下推尽量更多的计算到存储层MySQL上执行。可下推计算主要包括:

  • JOIN连接
  • 过滤条件(如WHEREHAVING
  • 计算(如COUNTGROUP BY
  • 排序(如ORDER BY
  • 去重(如DISTINCT
  • 函数计算(如NOW()函数)
  • 子查询

通过explain optimizer + sql可以看到查询改写的具体过程。

Project和Filter下推

一条SQL的执行计划在如下生成过程中,Filter和Project被先后下推到LogicalView算子里面。Filter和Project下推可以达到提前过滤数据,减少网络传输等效果。


mysql> explain optimizer select c_custkey,c_name from customer where c_custkey = 1;

其中c_custkey是分区键。1111.png

背景信息

根据PolarDB-X的SQL语句优化的基本原则,可以下推尽量更多的计算到存储层MySQL上执行。可下推计算主要包括:

  • JOIN连接
  • 过滤条件(如WHEREHAVING
  • 计算(如COUNTGROUP BY
  • 排序(如ORDER BY
  • 去重(如DISTINCT
  • 函数计算(如NOW()函数)
  • 子查询

通过explain optimizer + sql可以看到查询改写的具体过程。

Project和Filter下推

一条SQL的执行计划在如下生成过程中,Filter和Project被先后下推到LogicalView算子里面。Filter和Project下推可以达到提前过滤数据,减少网络传输等效果。


mysql> explain optimizer select c_custkey,c_name from customer where c_custkey = 1;

其中c_custkey是分区键。22222.png

拆分键不为c_nationkey情况:6666.png

JOIN下推

JOIN下推需要满足以下条件:

  • t1与t2表的拆分方式一致(包括分库键、分表键、拆分函数、分库分表数目)。
  • JOIN条件中包含t1,t2表拆分键的等值关系。此外,任意表JOIN广播表总是可以下推。


mysql> explain optimizer select * from t1, t2 where t1.id = t2.id;

一条SQL的执行计划在如下生成过程中,JOIN下推到LogicalView算子里面。JOIN下推可以达到计算离存储更近,并行执行加速的效果。1.1.png

JoinClustering

当有多个表执行JOIN操作时,PolarDB-X会通过join clustering的优化技术将JOIN进行重排序,将可下推的JOIN放到相邻的位置,从而让它可以被正常下推。示例如下:

假设原JOIN顺序为t2、t1、l2, 经过重排序之后,t2和l2的JOIN操作依然能下推到LogicalView。SQL复制代码


mysql> explain select t2.id from t2 join t1 on t2.id = t1.id join l2 on t1.id = l2.id;
Project(id="id")
  HashJoin(condition="id = id AND id = id0", type="inner")
    Gather(concurrent=true)
      LogicalView(tables="t2_[0-3],l2_[0-3]", shardCount=4, sql="SELECT `t2`.`id`, `l2`.`id` AS `id0` FROM `t2` AS `t2` INNER JOIN `l2` AS `l2` ON (`t2`.`id` = `l2`.`id`) WHERE (`t2`.`id` = `l2`.`id`)")
    Gather(concurrent=true)
      LogicalView(tables="t1", shardCount=2, sql="SELECT `id` FROM `t1` AS `t1`")

子查询下推

一条SQL的执行计划在如下生成过程中,子查询下推到LogicalView算子里面。子查询下推可以达到计算离存储更近,并行执行加速的效果。

  1. 子查询会先被转换成Semi JoinAnti Join
  2. 如果满足上节中JOIN下推的判断条件,就会将Semi JoinAnti Join下推至LogicalView
  3. 下推后的Semi JoinAnti Join会被还原为子查询。


explain optimizer select * from t1 where id in (select id from t2);

2.1.png

相关实践学习
快速体验PolarDB开源数据库
本实验环境已内置PostgreSQL数据库以及PolarDB开源数据库:PolarDB PostgreSQL版和PolarDB分布式版,支持一键拉起使用,方便各位开发者学习使用。
相关文章
|
8天前
|
SQL 存储 缓存
如何优化SQL查询性能?
【10月更文挑战第28天】如何优化SQL查询性能?
46 10
|
2天前
|
SQL 关系型数据库 MySQL
|
15天前
|
SQL 数据库 开发者
功能发布-自定义SQL查询
本期主要为大家介绍ClkLog九月上线的新功能-自定义SQL查询。
|
11天前
|
SQL 关系型数据库 MySQL
mysql编写sql脚本:要求表没有主键,但是想查询没有相同值的时候才进行插入
mysql编写sql脚本:要求表没有主键,但是想查询没有相同值的时候才进行插入
24 0
|
22天前
|
SQL 数据可视化 BI
SQL语句及查询结果解析:技巧与方法
在数据库管理和数据分析中,SQL语句扮演着至关重要的角色
|
2月前
|
关系型数据库 MySQL 网络安全
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
|
4月前
|
SQL 存储 监控
SQL Server的并行实施如何优化?
【7月更文挑战第23天】SQL Server的并行实施如何优化?
103 13
|
4月前
|
SQL
解锁 SQL Server 2022的时间序列数据功能
【7月更文挑战第14天】要解锁SQL Server 2022的时间序列数据功能,可使用`generate_series`函数生成整数序列,例如:`SELECT value FROM generate_series(1, 10)。此外,`date_bucket`函数能按指定间隔(如周)对日期时间值分组,这些工具结合窗口函数和其他时间日期函数,能高效处理和分析时间序列数据。更多信息请参考官方文档和技术资料。
|
4月前
|
SQL 存储 网络安全
关系数据库SQLserver 安装 SQL Server
【7月更文挑战第26天】
59 6
|
4月前
|
存储 SQL C++
对比 SQL Server中的VARCHAR(max) 与VARCHAR(n) 数据类型
【7月更文挑战7天】SQL Server 中的 VARCHAR(max) vs VARCHAR(n): - VARCHAR(n) 存储最多 n 个字符(1-8000),适合短文本。 - VARCHAR(max) 可存储约 21 亿个字符,适合大量文本。 - VARCHAR(n) 在处理小数据时性能更好,空间固定。 - VARCHAR(max) 对于大文本更合适,但可能影响性能。 - 选择取决于数据长度预期和业务需求。
329 1
下一篇
无影云桌面