PolarDB之后,PawSQL如何进一步优化相关标量子查询?

2024-09-02 18:52

本文主要是介绍PolarDB之后,PawSQL如何进一步优化相关标量子查询?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在数据分析领域里,相关标量子查询无疑是一把双刃剑:它功能强大,能解决许多复杂问题,同时又因其复杂性给数据库优化器带来了不小的挑战。当前,只有像Oracle这样的商业数据库巨头在这方面做得相对出色[1],在国产数据库领域,也只有PolarDB对其提供了一定的支持[2]。

除了PolarDB,领先的SQL优化引擎PawSQL也提供了对相关标量子查询进行基于成本的重写优化;此外,PawSQL还会合并查询中的多个类似标量子查询,从而进一步提升标量子查询优化的性能。

图片

🌟 相关标量子查询

在SQL的世界里,相关标量子查询(Correlated Scalar Subquery)是一种强大的工具,它允许子查询依赖于外部查询的列值。这与那些独立于外部查询的非相关标量子查询形成鲜明对比。相关标量子查询通过引用外部查询中的列,为每一行数据计算子查询的结果。

示例

SELECT employee_name
FROM employees e
WHERE salary > (SELECT AVG(salary)FROM employeesWHERE department_id = e.department_id);

在这个例子中,子查询计算每个部门的平均薪资,并与主查询中的salary进行比较,展示了相关标量子查询的强大功能。

🏎️ 性能挑战:数据库优化器的视角

相关标量子查询虽然强大,但也给数据库优化器带来了不小的挑战:

  • 重复计算:在大数据集上,子查询可能会被重复计算,影响性能。

  • 高计算开销:复杂的计算,如聚合函数,可能导致查询性能下降。

  • 查询重写难题:将标量子查询转换为连接操作或其他形式并不总是容易的。

  • 数据依赖性:优化效果依赖于数据分布和表结构,需要优化器灵活应对。

对于相关标量子查询,解关联后的性能并不总是优于关联子查询,所以仅仅依靠启发式算法的重写无法完成性能优化的目标,需要使用基于代价的重写优化策略。目前,只有少数数据库如Oracle[1]和PolarDB[2]实现了这些高级优化技术。

🚀PawSQL:相关标量子查询优化的新境界

PawSQL优化引擎通过以下方式优化相关标量子查询:

  1. 基于代价的重写:支持条件和选择列中的标量子查询重写优化。

  2. 合并重写:合并多个结构相似的标量子查询,减少计算量。

🎯 案例

1. 原始查询:原查询使用了两个相关标量子查询,分别计算每个客户在特定日期的订单总价和订单数量。这种结构通常效率较低,因为需要为每个客户重复执行两个子查询。

SELECT c_custkey,(SELECT SUM(o_totalprice)FROM ORDERSWHERE o_custkey = c_custkey AND o_orderdate = '2020-04-16') AS total,(SELECT COUNT(*)FROM ORDERSWHERE o_custkey = c_custkey AND o_orderdate = '2020-04-16') AS cnt
FROM CUSTOMER

2. 重写后的查询:PawSQL优化引擎将两个相关子查询合并为一个派生表(derived table),然后通过外连接(left outer join)与主查询关联。

SELECT /*QB_1*/ c_custkey, SUM_ AS total, count_ AS cnt
FROM CUSTOMER LEFT OUTER JOIN (SELECT o_custkey, SUM(o_totalprice) AS SUM_, COUNT(*) AS count_FROM ORDERSWHERE o_orderdate = '2020-04-16'GROUP BY o_custkey) AS SQ ON o_custkey = c_custkey

3. 执行计划改进:

  • 通过预先聚合 orders 表的数据,大大减少了需要处理的数据量

  • 消除了重复的子查询执行,将两个子查询合并为一个

  • 使用哈希连接来高效地关联 customer 和聚合后的 orders 数据

图片

4. 性能提升:从执行计划可以看到,优化后,性能提升了1131.26%!

🌟总结

这个优化案例展示了PawSQL对于相关标量子查询重写技术的有效性。通过将多个相关子查询合并为一个派生表,并使用外连接,优化器能够显著减少重复计算和数据访问。通过PawSQL,您可以在MySQL、PostgreSQL、openGauss等数据库上,体验Oracle般的重写优化能力。

🌐 关于PawSQL

PawSQL专注于数据库性能优化自动化和智能化,提供的解决方案覆盖SQL开发、测试、运维的整个流程,广泛支持MySQL、PostgreSQL、OpenGauss、Oracle等主流商用和开源数据库,以及openGauss,人大金仓、达梦等国产数据库,为开发者和企业提供一站式的创新SQL优化解决方案;有效解决了数据库SQL性能及质量问题,提升了数据库系统的稳定性、应用性能和基础设施利用率,为企业节省了大量的运维成本和时间投入。

PawSQL产品家族

  • PawSQL优化平台 - 面向应用开发者,只需三步即可智能优化SQL性能。该平台提供丰富的查询重写功能、智能索引推荐以及自动化性能验证,通过语义等价转换和执行计划分析,最大限度提升SQL执行效率。

  • PawSQL审核平台 - 面向DevOps管控人员,集成完备的审核规则集,能覆盖数据定义语言(DDL)、数据操作语言(DML)、数据查询语言(DQL)等各种SQL语法,审核准确率高达95%,有效提升SQL代码质量。

  • PawSQL巡检平台 - 面向数据库运维人员,具备自动化采集和分析慢查询的能力,并提供专业的SQL优化建议。同时支持对数据库对象如表、索引等进行审核巡检,及时发现并规避潜在风险。

PawSQL往期文章精选

  • SQL性能优化的新视界 - PawSQL Plan Visualizer

  • SQLE、SQM和PawSQL:企业级SQL审核平台的深度评测

  • SQL优化从未如此简单,PawSQL Cloud实践指南

    获取更多关于PawSQL的信息,点击关注PawSQL公众号👇👇👇

这篇关于PolarDB之后,PawSQL如何进一步优化相关标量子查询?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1130787

相关文章

MySQL索引的优化之LIKE模糊查询功能实现

《MySQL索引的优化之LIKE模糊查询功能实现》:本文主要介绍MySQL索引的优化之LIKE模糊查询功能实现,本文通过示例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一、前缀匹配优化二、后缀匹配优化三、中间匹配优化四、覆盖索引优化五、减少查询范围六、避免通配符开头七、使用外部搜索引擎八、分

SQL表间关联查询实例详解

《SQL表间关联查询实例详解》本文主要讲解SQL语句中常用的表间关联查询方式,包括:左连接(leftjoin)、右连接(rightjoin)、全连接(fulljoin)、内连接(innerjoin)、... 目录简介样例准备左外连接右外连接全外连接内连接交叉连接自然连接简介本文主要讲解SQL语句中常用的表

MySQL高级查询之JOIN、子查询、窗口函数实际案例

《MySQL高级查询之JOIN、子查询、窗口函数实际案例》:本文主要介绍MySQL高级查询之JOIN、子查询、窗口函数实际案例的相关资料,JOIN用于多表关联查询,子查询用于数据筛选和过滤,窗口函... 目录前言1. JOIN(连接查询)1.1 内连接(INNER JOIN)1.2 左连接(LEFT JOI

MySQL 中查询 VARCHAR 类型 JSON 数据的问题记录

《MySQL中查询VARCHAR类型JSON数据的问题记录》在数据库设计中,有时我们会将JSON数据存储在VARCHAR或TEXT类型字段中,本文将详细介绍如何在MySQL中有效查询存储为V... 目录一、问题背景二、mysql jsON 函数2.1 常用 JSON 函数三、查询示例3.1 基本查询3.2

MySQL中的交叉连接、自然连接和内连接查询详解

《MySQL中的交叉连接、自然连接和内连接查询详解》:本文主要介绍MySQL中的交叉连接、自然连接和内连接查询,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、引入二、交php叉连接(cross join)三、自然连接(naturalandroid join)四

mysql的基础语句和外键查询及其语句详解(推荐)

《mysql的基础语句和外键查询及其语句详解(推荐)》:本文主要介绍mysql的基础语句和外键查询及其语句详解(推荐),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋... 目录一、mysql 基础语句1. 数据库操作 创建数据库2. 表操作 创建表3. CRUD 操作二、外键

如何解决mmcv无法安装或安装之后报错问题

《如何解决mmcv无法安装或安装之后报错问题》:本文主要介绍如何解决mmcv无法安装或安装之后报错问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mmcv无法安装或安装之后报错问题1.当我们运行YOwww.chinasem.cnLO时遇到2.找到下图所示这里3.

Python通过模块化开发优化代码的技巧分享

《Python通过模块化开发优化代码的技巧分享》模块化开发就是把代码拆成一个个“零件”,该封装封装,该拆分拆分,下面小编就来和大家简单聊聊python如何用模块化开发进行代码优化吧... 目录什么是模块化开发如何拆分代码改进版:拆分成模块让模块更强大:使用 __init__.py你一定会遇到的问题模www.

Mybatis 传参与排序模糊查询功能实现

《Mybatis传参与排序模糊查询功能实现》:本文主要介绍Mybatis传参与排序模糊查询功能实现,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、#{ }和${ }传参的区别二、排序三、like查询四、数据库连接池五、mysql 开发企业规范一、#{ }和${ }传参的

SpringBoot首笔交易慢问题排查与优化方案

《SpringBoot首笔交易慢问题排查与优化方案》在我们的微服务项目中,遇到这样的问题:应用启动后,第一笔交易响应耗时高达4、5秒,而后续请求均能在毫秒级完成,这不仅触发监控告警,也极大影响了用户体... 目录问题背景排查步骤1. 日志分析2. 性能工具定位优化方案:提前预热各种资源1. Flowable