概述

在推出针对MySQL、PostgreSQL等开源数据库的智能索引推荐工具Paw Index Advisor之后,PawSQL近日推出了一站式的SQL性能优化工具PawSQL Advisor。PawSQL Advisor除了集成了Paw Index Advisor强大的索引推荐功能外,还把业界关于关系数据库查询优化最佳实践整合其中,从正确性和性能两个方面对SQL进行审查和重写优化,一站解决SQL性能优化问题。

本文基于以下文章,更新了新增的重写优化规则一站式SQL优化工具PawSQL Advisorhttps://mp.csdn.net/mp_blog/creation/editor/126269804

功能概述

PawSQL Advisor的功能框架如下,

  • 基于规则的SQL审查,包括正确性审查和性能优化审查规则。

  • 基于规则的重写优化,推荐语义等价、但执行效率更高的SQL。

  • 智能索引推荐,满足各种SQL语法组合的场景下,推荐最优的索引组合。

  • 优化验证,确保基于SQL重写和索引推荐的新方案有着更好的性能。

优化规则

正确性规则

  • =null或是case when null并不能判断表达式为空,判断表达式为空应该使用is nullPawSQL 提供重写优化

  • NOT IN子查询且选择列可空,这种情况不会返回任何记录(PawSQL 提供重写优化

  • ALL修饰的条件子查询且选择列为空,这种情况不会返回任何记录(PawSQL 提供重写优化

  • 使用limit的update语句可能导致非预期的操作结果(PawSQL提示预警)

  • 未使用 ORDER BYLIMIT 查询,可能导致多次执行的结果不一致(PawSQL提示预警)

  • 使用没有where条件、或where 1=1等变相没有条件的update/merge/delete语句(PawSQL提示预警)

  • insert 语句必须指定column, 减少插入列与结果表错位的可能性(PawSQL提示预警)

性能优化规则

  • 避免使用全模糊搜索或左模糊搜索;无法利用索引快速定位记录(PawSQL提示预警)

  • 对条件字段使用函数操作;索引无法使用,导致全表扫描(PawSQL提供重写优化

  • 条件字段存在数值和字符的隐式转换;索引无法使用,导致全表扫描(PawSQL重写优化

  • 不建议使用select *语法;影响后续的优化逻辑,而且难以维护(PawSQL提示预警)

  • 避免使用max/min标量子查询;可以进行重写以利用B+树有序性来避免排序和访问不必要的数据(PawSQL 提供重写优化

  • 标量子查询(count(*)>0count(col)>0)应该改写为exists;避免访问不必要的数据(PawSQL 提供重写优化

  • union all代替unionunion需要分组去重,影响性能(PawSQL提示预警)

  • delete/update 包含or条件,可以拆成多个独立的update/delete语句; 包含or的条件可能没有办法利用索引(PawSQL 提供重写优化

  • or语句使用union/union all代替; 包含or的条件可能没有办法利用索引(PawSQL 提供重写优化

  • 条件下推,先过滤,后分组 (having子句放到where子句里),提升性能(PawSQL 提供重写优化

  • delete/update 语句不能有order by而没有limit;没有Limit的排序没有意义,但是会使性能变差(PawSQL 提供重写优化

  • 使用没有where条件、或where 1=1等变相没有条件的查询语句,且没有分组聚集和limit语句(PawSQL 提供重写优化

  • 嵌套查询超过指定阈值(默认值为大于等于2);太复杂的SQL影响plan的性能,且容易产生性能较差的执行计划(PawSQL提示预警)

  • 使用JOIN连接表查询数目建议不超过阈值(默认值为大于等于5);太复杂的SQL影响plan的产生的性能,且容易产生性能较差的执行计划(PawSQL提示预警)

  • 谨慎使用select ... for updatefor update锁表或锁记录(PawSQL提示预警)

  • 单条insert语句,建议批量插入不超过阈值(默认为500)(PawSQL提示预警)

  • 在索引列上存在算术运算或是函数,无法使用索引(PawSQL 提供重写优化

  • Query Folding, 减少中间表,提供更多优化选择,提升性能(PawSQL 提供重写优化

  • 投影下推,减少数据IO,促发避免回表的索引推荐(PawSQL 提供重写优化

  • SAT-TC重写优化,根据一组条件,简化或是推断出新的条件(PawSQL 提供重写优化

索引推荐

索引的作用有如下三个:

- 快速定位数据记录(等值条件、范围条件);

- 避免排序(order by/group by/distinct/union/sort merge join);

- 避免回表,即只访问索引文件而不访问数据表就可以完成查询操作。

PawSQL Advisor继承了Paw Index Advisor的智能索引推荐能力,它针对不同的语法结构,结合系统的数据字典、统计信息,分析评估所有的索引可选项,基于启发式算法和基于代价的算法,进行索引的推荐。具体信息请参考Paw Index Advisor的相关介绍。

优化验证(What-if)

PawSQL Advisor提供一个对推荐出来的SQL和索引进行验证的功能,它连接到一个测试库,并收集推荐之前、执行之后的执行计划及估算的代价等信息,对推荐信息进行验证,并把验证后有效的推荐呈现给用户。所以最终我们可以在最终的推荐结果里看到:

1. 整体性能提升百分比(Overall performance inprovemement)
2. 单个SQL的性能提升百分比(Performance improvement for single sql)
3. 单个SQL优化前的执行计划(Query execution plan before tuning)
4. 单个SQL优化后的执行计划(Query execution plan after tuning)

同时,所有推荐的索引都是在某个SQL的执行计划中出现过,并对此SQL的性能有帮助的。

执行结果解读

整体优化建议(pawTuningSummary.txt)

查看pawTuningSummary文件获取优化的整体信息,主要包括四部分。

  1. 整体优化概要

  2. 规则审查情况

  3. 推荐索引信息

  4. 单sql优化列表

    /********************************************************************\
    *                                                                   *
    *               PawSQL Optimization Summary                       *
    *                                                                   *
    *                 Powered by PawSQL(2022- )                         *
    *                                                                   *
    \********************************************************************/
    1. Optimization Summary
    - There are 104 query analyzed;
    - There are 3 optimization rewrites for 2 queries;
    - There are 207 violations of optimization rule against 68 queries;
    - There are 79 indices recommended for 76 queries;
    - There is 7151.69% performance improvement.2. Optimization Rule Violations
    - RuleCntGtThanZeroRewrite: [query41.sql-stmt1]
    - RuleFuncWithColumnInPredicate: [query8.sql-stmt1, query64.sql-stmt1]
    - RuleNoCond4NonAggSelect: [query8.sql-stmt1, query33.sql-stmt1, query77.sql-stmt1]
    - RuleNumOfJoinTables: [query46.sql-stmt1, query84.sql-stmt1 ...]
    ...3. Recommended Indices
    - CREATE INDEX PAW_IDX0571264614 ON TPDS.ITEM(I_CURRENT_PRICE,I_ITEM_SK,I_ITEM_ID);
    - CREATE INDEX PAW_IDX0205789795 ON TPDS.ITEM(I_CATEGORY,I_CURRENT_PRICE);
    - CREATE INDEX PAW_IDX0866411600 ON TPDS.ITEM(I_MANUFACT_ID,I_PRODUCT_NAME);
    - CREATE INDEX PAW_IDX1917304708 ON TPDS.ITEM(I_MANAGER_ID,I_ITEM_SK);
    ...4. Optimized Query List
    - query1.sql-stmt1, performance improves by 438790.26%[costBefore=71231.89,costAfter=16.23]
    -- Contributing indices:[PAW_IDX0410610163, PAW_IDX0827928186, <AUTO_KEY0>, PRIMARY, PRIMARY]- query10.sql-stmt1, performance improves by 3974905.54%[costBefore=1097101.53,costAfter=27.59]
    -- Contributing indices:[PAW_IDX0410610163, PAW_IDX0426775377, PRIMARY, PAW_IDX0410610163, PAW_IDX0127412485, PAW_IDX0410610163, PAW_IDX1696683664, PRIMARY, PRIMARY]- query11.sql-stmt1, performance improves by 28.56%[costBefore=322948.99,costAfter=251195.7199]
    -- Contributing indices:[PAW_IDX0410610163, PAW_IDX2001631254, PRIMARY, PAW_IDX1991665978, PRIMARY, PRIMARY]
    ...

单SQL优化详情

内容包括

  1. 原始输入SQL
  2. 改写后的SQL
  3. 规则审查情况
  4. 索引推荐情况
  5. What-if Analysis(性能验证)
    • 性能提升比

    • 优化之前的执行计划

    • 优化之后的执行计划


/********************************************************************\
*                                                                   *
*             SQL Tuning(Query and Index) Details                 *
*                                                                   *
*               Powered by PawSQL(2022 - )                         *
*                                                                   *
\*******************************************************************/
1. Original Query(formatted)
select c_orders.c_count, count(*) as custdistfrom (select customer.c_custkey, count(orders.o_orderkey) as c_countfrom TPCH.customer left outer join TPCH.orders on (customer.c_custkey = orders.o_custkeyand orders.o_comment not like '%pending%deposits%')group by customer.c_custkey) as c_ordersgroup by c_orders.c_countorder by custdist desc, c_orders.c_count desc2. Rewritten Query3. Auditing Rule Violations
- Rule:RulePredicateLikeStartWithWildcard
- Violation Parts:
orders.o_comment not like '%pending%deposits%';4. Index Tuning
- CREATE INDEX PAW_IDX2038863975 ON TPCH.CUSTOMER(C_CUSTKEY,C_NAME(16));
- CREATE INDEX PAW_IDX0890500073 ON TPCH.ORDERS(O_CUSTKEY,O_COMMENT(16),O_ORDERKEY);5. Validation details
5.1 Performance improves by 69246.63%[cost_before=8.089240324150001E9,after_cost=1.166493588E7]
5.2 Query Plan(before)
-> Sort: custdist DESC, c_orders.c_count DESC-> Table scan on <temporary>-> Aggregate using temporary table-> Table scan on c_orders  (cost=2.50..2.50 rows=0)-> Materialize  (cost=2.50..2.50 rows=0)-> Table scan on <temporary>-> Aggregate using temporary table-> Left hash join (orders.O_CUSTKEY = customer.C_CUSTKEY)  (cost=8089149945.61 rows=80891468955)-> Table scan on customer  (cost=90373.50 rows=795135)-> Hash-> Filter: (not((orders.O_COMMENT like '%pending%deposits%')))  (cost=0.02 rows=101733)-> Table scan on orders  (cost=0.02 rows=101733)5.3 Query Plan(after)
-> Sort: custdist DESC, c_orders.c_count DESC-> Table scan on <temporary>-> Aggregate using temporary table-> Table scan on c_orders  (cost=0.01..102760.96 rows=8220678)-> Materialize  (cost=4611746.21..4714507.16 rows=8220678)-> Group aggregate: count(orders.O_ORDERKEY)  (cost=3789678.43 rows=8220678)-> Nested loop left join  (cost=2967610.67 rows=8220678)-> Index scan on customer using PAW_IDX2038863975  (cost=90373.50 rows=795135)-> Filter: (not((orders.O_COMMENT like '%pending%deposits%')))  (cost=2.58 rows=10)-> Index lookup on orders using PAW_IDX0890500073 (O_CUSTKEY=customer.C_CUSTKEY)  (cost=2.58 rows=10

PawSQL专注数据库性能优化,有兴趣的小伙伴请在微信搜索关注公众号PawSQL。PawSQL Advisor已登录Jetbrains Marketplace, 可以通过名称搜索“PawSQL Advisor”安装。

一个专注SQL优化的IDEA插件(支持DataGrip/Pycharm等) - PawSQL Advisor相关推荐

  1. 工作记录二: 记录一次简单的SQL优化过程

    在工作时, 和同事一起遇到了一个关于SQL优化方面的问题, 现在将解决过程记录如下 项目缺陷描述 项目分析思路 首先F12进入开发者模式, 查看最费时的请求 然后利用restful风格接口工具集( R ...

  2. mysql存储过程更新数据后返回一个字段_史上最全存储引擎、索引使用及SQL优化的实践...

    整个MySQL Server由以下组成 : Connection Pool :连接池组件 Management Services & Utilities :管理服务和工具组件 SQL Inte ...

  3. java的for循环取出数据只是拿到最后一个_一问SQL优化就无从藏身?那只是你对原理的精髓掌握不深

    ​曾几何时,我信誓旦旦的认为只要 SQL 写的好,面试过程永不倒.结果在一次又一次的征途中,「最终还是以完败落下帷幕」. 结果都源于注重使用而忽略原理,从而不知也不了解「SQL」优化应如何面对.读文的 ...

  4. SQL调优(SQL TUNING)之远程支持完成性能大幅优化

    前几天,一个朋友找到我,说一个SQL性能有问题,看看能不能优化,下面为过程: 雪豹 9:35:10 在吗 兰花岛主 15:07:39 忙忘了,有事儿? 雪豹 15:07:49 嗯 雪豹 15:07:5 ...

  5. SQL优化很难怎么办?给你一个简单暴力的办法

    导读: 本文节选自松华老师的<SQL优化专栏> 郑松华,知数堂SQL 优化班老师 现任 CCmediaService DBA,主要负责数据库优化相关工作 擅长SQL优化 ,数据核对 想内容 ...

  6. SQL优化基础 使用索引(一个小例子)

    2019独角兽企业重金招聘Python工程师标准>>> 按照本文操作和体会,会对sql优化有个基本最简单的了解,其他深入还需要更多资料和实践的学习:  1. 建表: 复制代码 代码如 ...

  7. 关于数据库SQL优化

    1.数据库访问优化 要正确的优化SQL,我们需要快速定位能性的瓶颈点,也就是说快速找到我们SQL主要的开销在哪里?而大多数情况性能最慢的设备会是瓶颈点,如下载时网络速度可能会是瓶颈点,本地复制文件时硬 ...

  8. 超详细图解!【MySQL进阶篇】SQL优化-索引-存储引擎

    1. Mysql的体系结构概览 整个MySQL Server由以下组成 Connection Pool : 连接池组件 Management Services & Utilities : 管理 ...

  9. MySQL 优化 —— SQL优化概述(优化专题开篇词)

    引言 最近为了研究索引的知识,特地去MySQL 官网研读了一番,发现MySQL官网有比较全面的MySQL优化方案和知识背景,所以希望通过一系列文章,将官网的知识翻译总结一下,避免日后去网上胡乱搜索产生 ...

  10. 笔记12 SQL优化

    笔记12 性能与SQL优化 1.性能优化 复习一下什么是性能: DB/SQL 优化是业务系统性能优化的核心 2.关系数据库 MySQL 什么是关系数据库 数据库设计范式 常见关系数据库 SQL 语言 ...

最新文章

  1. python神秘的魔法函数_python进阶之魔法函数
  2. char str[]与char *str的区别
  3. css美化单选款、复选框
  4. Servlet的部分request请求处理
  5. 甲骨文全球大会——看SOA
  6. 数字图像处理与Python实现笔记之频域滤波
  7. 每日两SQL(10),欢迎交流~
  8. php获取网页输出,PHP 利用AJAX获取网页并输出的实现代码(Zjmainstay)_PHP教程
  9. [详解]Linux的目录里都装些啥??
  10. mongo性能测试demo 代码正确运行
  11. Arcgis(三)——重分类
  12. PS制作一寸带白框的证件照
  13. 如何删除ppt自带背景音乐_ppt模板里自带的背景乐怎么去掉?
  14. 快收下这枚 Scrapy Requests 口味的爬虫“回魂丹”
  15. 人工智能实验--汉诺塔规约图(四个盘子)
  16. CMNET和CMWAP简单区别
  17. 事关ChatGPT账号封禁的强烈忠告
  18. AD2019网络标号批量改名
  19. 集群中zeus平台的变更
  20. 天道酬勤系列之C++ 变量类型介绍

热门文章

  1. 《深入浅出数据分析》读后详解
  2. 视频教程-路由技术(CCNA魔鬼训练营系列)-思科认证
  3. 10年专业导师整理的单片机控制电动机正反转设计类毕业论文文献
  4. fifaol3服务器位置,FIFAOL3新手教学 讲解球场上的每个位置
  5. 学计算机的学后感,计算机学习心得体会(通用10篇)
  6. java 手机号码归属地查询
  7. DevExpress DXperience 的本地化(汉化)方法
  8. 【Python网络蜘蛛 · 1】:网络蜘蛛的基本介绍
  9. 【全套完结】模拟电子技术基础——全套实验手册及仿真工艺实习【建议保存】
  10. 易语言exe读写游戏例程源码_游戏工作室建立三步曲2019:脚本、防封与人工智能...