SQL优化技术分享:从 321 秒到 0.2 秒的性能飞跃 —— 基于 PawSQL 的 TPCH 查询优化实战

news2025/7/19 5:43:48

在数据库性能优化领域,TPC-H 测试集是一个经典的基准测试工具,常用于评估数据库系统的查询性能。本文将基于 TPCH 测试集中的第 20个查询,结合 PawSQL 自动化优化工具,详细分析如何通过 SQL 重写和索引设计,将查询性能从 321 秒提升到 0.2 秒,性能提升高达1541倍。

1. 背景介绍:一个典型的多表关联分析查询

TPC-H作为业界公认的数据库性能测试基准,其第20号查询(Q20)是一个极具挑战性的复杂分析查询。这个查询的业务场景是:识别阿尔及利亚('ALGERIA')地区库存充足的供应商,具体条件是这些供应商提供的绿色('green%')零件的库存量(ps_availqty)超过该零件在过去一年内订单总量的一半。

原始SQL语句如下:

select s_name, s_address
from supplier, nation
where s_suppkey in (
    select ps_suppkey
    from partsupp
    where ps_partkey in (
        select p_partkey
        from part
        where p_name like 'green%'
    )
    and ps_availqty > (
        select 0.5 * sum(l_quantity)
        from lineitem
        where l_partkey = ps_partkey
        and l_suppkey = ps_suppkey
        and l_shipdate >= date '1997-01-01'
        and l_shipdate < date '1997-01-01' + interval '1' YEAR
    )
)
and s_nationkey = n_nationkey 
and n_name = 'ALGERIA'
order by s_name

在实际测试环境中,这个查询的执行时间达到了惊人的321秒,完全无法满足业务系统的要求。

2. 性能瓶颈分析:为什么这么慢?

 

从执行计划可以看出主要性能问题:

  • 子查询执行次数多:相关子查询被执行了848次,每次耗时约378ms

  • 表扫描泛滥:对partsupp、part和lineitem表进行了全表扫描

  • 嵌套循环效率低:对lineitem表的访问在嵌套循环最内层

  • 排序操作代价高:最后需要对结果集进行排序

3. PawSQL的优化方案:系统性解决方案

PawSQL作为专业的SQL优化工具,针对上述问题提供了一套完整的优化方案:

3.1 SQL重写:从IN到EXISTS

将IN子查询转换为EXISTS形式,在有合适索引的情况下,这种改写通常能让优化器生成更高效的执行计划:

where exists (select /*QB_1*/ partsupp.ps_suppkey
      from partsupp, (...)
      where exists (select /*QB_4*/ part.p_partkey
                      from part
                      where part.p_name like 'green%' and part.p_partkey = partsupp.ps_partkey)
          and partsupp.ps_availqty > SQ_1742975670803.null_
          and partsupp.ps_suppkey = supplier.s_suppkey
          and SQ_1742975670803.l_partkey = partsupp.ps_partkey
          and SQ_1742975670803.l_suppkey = partsupp.ps_suppkey)

 

3.2 SQL重写:提前聚合计算

将lineitem的聚合计算从子查询中提取出来,预先计算每个(零件,供应商)组合的总量:

select 0.5 * sum(l_quantity) as null_, l_partkey,
    l_suppkey
from lineitem
where l_shipdate >= date '1997-01-01'
    and l_shipdate < date '1997-01-01' + interval '1' YEAR
group by l_partkey, l_suppkey

3.3 智能索引设计

除了SQL重写外,PawSQL还为优化后的SQL推荐了一系列索引,这些索引的创建为查询性能的提升提供了有力支持。

-- 加速lineitem表的聚合计算
CREATE INDEX PAWSQL_IDX1406058528 ON lineitem(l_shipdate,l_quantity,l_partkey,l_suppkey);

-- 优化nation表查询
CREATE INDEX PAWSQL_IDX0006674720 ON nation(n_name,n_nationkey);

-- 支持supplier表的排序和连接
CREATE INDEX PAWSQL_IDX1461825654 ON supplier(s_name,s_address,s_nationkey);
CREATE INDEX PAWSQL_IDX1670284145 ON supplier(s_nationkey,s_name,s_address);

-- 加速part和partsupp表的连接
CREATE INDEX PAWSQL_IDX0450194419 ON part(p_partkey,p_name);
CREATE INDEX PAWSQL_IDX1262756509 ON partsupp(ps_partkey,ps_suppkey,ps_availqty);

3.4 谓词下推

将过滤条件尽可能下推到数据访问层,减少中间结果集:

  • nation.n_name = 'ALGERIA'

  • part.p_name like 'green%'

  • lineitem.l_shipdate范围条件

3.5. 避免排序

通过创建包含s_name的索引,直接利用索引的有序性避免排序操作。

4. 优化效果:性能提升1541倍

 

优化前后的对比令人震撼:

指标优化前优化后提升幅度
执行时间321秒0.208秒154,124%
lineitem表扫描次数848次1次-
lineitem表扫描行数509,285,056行90,514行-
排序操作需要显式排序利用索引避免排序-

执行计划对比

  • 优化前:全表扫描→嵌套循环→重复计算

  • 优化后:索引查找→哈希连接→物化视图

5. 经验总结:SQL优化最佳实践

通过这个案例,我们可以总结出以下SQL优化经验:

  1. 避免关联子查询:特别是重复执行的关联子查询,考虑改写为JOIN或提前物化

  2. 索引设计:尽量减少表扫描,同时兼顾避免回表操作

  3. 利用索引有序性:让索引顺序与ORDER BY一致可以避免排序操作

  4. 聚合计算预优化:对于重复的聚合计算,考虑提前计算并存储

  5. 专业工具辅助:使用PawSQL等专业工具可以快速定位问题并提供优化方案

这个案例生动展示了:即使是极其复杂的分析查询,通过系统性的优化方法,也能实现从分钟级到亚秒级的性能飞跃

🌐 关于PawSQL

PawSQL专注于数据库性能优化自动化和智能化,提供的解决方案覆盖SQL开发、测试、运维的整个流程,广泛支持包括MySQL/PostgreSQL/Oracle /openGauss/TDSQL/Oceanbase/达梦DM/金仓等各种主流商用和开源数据库,为开发者和企业提供一站式的创新SQL优化解决方案。

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2331889.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

密码学基础——DES算法

前面的密码学基础——密码学文章中介绍了密码学相关的概念&#xff0c;其中简要地对称密码体制(也叫单钥密码体制、秘密密钥体制&#xff09;进行了解释&#xff0c;我们可以知道单钥体制的加密密钥和解密密钥相同&#xff0c;单钥密码分为流密码和分组密码。 流密码&#xff0…

在 Linux 终端中轻松设置 Chromium 的 User-Agent:模拟手机模式与自定义浏览体验

在 Linux 系统中&#xff0c;通过终端灵活控制 Chromium 的行为可以大幅提升工作效率。本文将详细介绍如何通过命令行参数和环境变量自定义 Chromium 的 User-Agent&#xff0c;并结合手机模式模拟&#xff0c;实现更灵活的浏览体验。 为什么需要自定义 User-Agent&#xff1f;…

http页面的加载过程

HTTP/2 核心概念 1.1 流&#xff08;Stream&#xff09; • 定义&#xff1a;HTTP/2 连接中的逻辑通道&#xff0c;用于传输数据&#xff0c;每个流有唯一标识符&#xff08;Stream ID&#xff09;。 • 特点&#xff1a; ◦ 支持多路复用&#xff08;多个流并行传输&#…

MySQL【8.0.41版】安装详细教程--无需手动配置环境

一、MySQL 介绍 1. 概述 MySQL 是一个开源的关系型数据库管理系统&#xff0c;由瑞典公司 MySQL AB 开发&#xff0c;现属于 Oracle 旗下。它基于 SQL&#xff08;结构化查询语言&#xff09;进行数据管理&#xff0c;支持多用户、多线程操作&#xff0c;广泛应用于 Web 应用、…

鸿蒙ArkTS实战:从零打造智能表达式计算器(附状态管理+路由传参核心实现)

还在为组件状态混乱、页面跳转丢参数而头疼&#xff1f; 这篇博客将揭秘如何用鸿蒙ArkTS打造一个漂亮美观的智能计算器&#xff1a; ✅ 输入完整表达式&#xff0c;秒出结果——字符串切割简单计算 ✅ 状态管理黑科技——Provide/Consume 实现跨组件实时响应 ✅ 路由传参实战—…

qq邮箱群发程序

1.界面设计 1.1 环境配置 在外部工具位置进行配置 1.2 UI界面设计 1.2.1 进入QT的UI设计界面 在pycharm中按顺序点击&#xff0c;进入UI编辑界面&#xff1a; 点击第三步后进入QT的UI设计界面&#xff0c;通过点击按钮进行界面设计&#xff0c;设计后进行保存到当前Pycharm…

K8S学习之基础七十九:关闭istio功能

关闭istio功能 kubectl get ns --show-labels kubectl label ns default istio-injection-有istio-injectionenabled的命名空间&#xff0c;pod都会开启istio功能 反之&#xff0c;如果要开启istio&#xff0c;在对应命名空间打上该标签即可

上门预约洗鞋店小程序都具备哪些功能?

现在大家对洗鞋子的清洗条件越来越高&#xff0c;在家里不想去&#xff0c;那就要拿去洗鞋店去洗。如果有的客户没时间去洗鞋店&#xff0c;这个时候&#xff0c;有个洗鞋店小程序就可以进行上门取件&#xff0c;帮助没时间的客户去取需要清洗的鞋子&#xff0c;这样岂不是既帮…

蓝桥杯——走迷宫(Java-BFS)

这是一个经典的BFS算法 1. BFS算法保证最短路径 核心机制&#xff1a;广度优先搜索按层遍历所有可能的路径&#xff0c;首次到达终点的路径长度即为最短步数。这是BFS的核心优势。队列的作用&#xff1a;通过队列按先进先出的顺序处理节点&#xff0c;确保每一步探索的都是当…

下载firefox.tar.xz后如何将其加入到Gnome启动器

起因&#xff1a;近期&#xff08;2025-04-07&#xff09;发现firefox公布了130.0 版本&#xff0c;可以对pdf文档进行签名了&#xff0c;想试一下&#xff0c;所以卸载了我的Debian12上的firefox-esr,直接下载了新版本的tar.xz 包。 经过一番摸索&#xff0c;实现了将其加入Gn…

加密≠安全:文件夹密码遗忘背后的数据丢失风险与应对

在数字化时代&#xff0c;保护个人隐私和数据安全变得尤为重要。许多人选择对重要文件夹进行加密&#xff0c;以防止未经授权的访问。然而&#xff0c;一个常见且令人头疼的问题也随之而来——文件夹加密密码遗忘。当你突然发现自己无法访问那些加密的文件夹时&#xff0c;那种…

【开源宝藏】30天学会CSS - DAY12 第十二课 从左向右填充的文字标题动画

用伪元素搞定文字填充动效&#xff1a;一行 JS 不写&#xff0c;效果炸裂 你是否曾经在设计页面标题时&#xff0c;觉得纯文字太寡淡&#xff1f;或者想做一个有动感的文字特效&#xff0c;但又不想引入 JS 甚至 SVG&#xff1f; 在这篇文章中&#xff0c;我们将通过 一段不到…

nginx或tengine服务器,配置HTTPS下使用WebSocket的线上环境实践!

问题描述&#xff1a; HTTPS 下发起WS连接&#xff0c;连接失败&#xff0c;Chrom 浏览器报错。 socket.js:19 Mixed Content: The page at https://app.XXX.com was loaded over HTTPS, but attempted to connect to the insecure WebSocket endpoint ws://172.16.10.80:903…

【Oracle篇】跨字符集迁移:基于数据泵的ZHS16GBK转AL32UTF8全流程迁移

&#x1f4ab;《博主主页》&#xff1a;奈斯DB-CSDN博客 &#x1f525;《擅长领域》&#xff1a;擅长阿里云AnalyticDB for MySQL(分布式数据仓库)、Oracle、MySQL、Linux、prometheus监控&#xff1b;并对SQLserver、NoSQL(MongoDB)有了解 &#x1f496;如果觉得文章对你有所帮…

西门子S7-1200PLC 工艺指令PID_Temp进行控温

1.硬件需求&#xff1a; 西门子PLC&#xff1a;CPU 1215C DC/DC/DC PLC模块&#xff1a;SM 1231 TC模块 个人电脑&#xff1a;已安装TIA Portal V17软件 加热套&#xff1a;带加热电源线以及K型热电偶插头 固态继电器&#xff1a;恩爵 RT-SSK4A2032-08S-F 其他&#xff1…

vant4+vue3上传一个pdf文件并实现pdf的预览。使用插件pdf.js

注意下载的插件的版本"pdfjs-dist": "^2.2.228", npm i pdfjs-dist2.2.228 然后封装一个pdf的遮罩。因为pdf文件有多页&#xff0c;所以我用了swiper轮播的形式展示。因为用到移动端&#xff0c;手动滑动页面这样比点下一页下一页的方便多了。 直接贴代码…

2025 数字中国创新大赛数字安全赛道数据安全产业积分争夺赛初赛-东部赛区WriteUp

2025 数字中国创新大赛数字安全赛道数据安全产业积分争夺赛初赛-东部赛区WriteUp 数据安全:ez_upload(60分)&#xff1a; 模型安全&#xff1a;数据分析&#xff1a;溯源与取证&#xff1a;1-1&#xff1a;1-2&#xff1a; 数据社工&#xff1a;2-2:2-3:2-4: 数据跨境&#xff…

2025 年网络安全终极指南

我们生活在一个科技已成为日常生活不可分割的一部分的时代。对数字世界的依赖性日益增强的也带来了更大的网络风险。 网络安全并不是IT专家的专属特权&#xff0c;而是所有用户的共同责任。通过简单的行动&#xff0c;我们可以保护我们的数据、隐私和财务&#xff0c;降低成为…

1.6-抓包技术(Burp Suite\Yakit抓包\Web、APP、小程序)

1.6-抓包技术&#xff08;Burp Suite\Yakit抓包\Web、APP、小程序&#xff09; 如果要使用抓包软件&#xff0c;基本上第一步都是要安装证书的。原因如下&#xff1a; 客户端&#xff08;浏览器或应用&#xff09;会检测到证书不受信任&#xff0c;并弹出 证书错误&#xff0…

图解力扣回溯及剪枝问题的模板应用

文章目录 选哪个的问题17. 电话号码的字母组合题目描述解题代码图解复杂度 选不选的问题78. 子集题目描述解题代码图解复杂度 两相转化77. 组合题目描述解题代码法一&#xff1a;按选哪个的思路法二&#xff1a;按选不选的思路 图解选哪个&#xff1a;选不选 复杂度 选哪个的问…