PawSQL更新 | 新增18个SQL性能审核重写规则

PawSQL最新版本针对DML和DQL新增了审核和重写优化规则共计33个,整体的规则数目达到了83个,覆盖了正确性,安全性、可维护性、性能四个方面的SQL质量问题,并提供了优化建议,已经形成比较完善的针对数据操作的SQL质量审查体系。本文介绍其中新增的11个正确性相关的审核规则。本文介绍新增的18个SQL性能审核及重写优化规则。

图片

性能相关规则

1. 显式禁止结果字段排序

规则描述

在MySQL的早期版本中,即使没有order by子句,group by默认也会按分组字段排序,这就可能导致不必要的文件排序,影响SQL的查询性能。可以通过添加order by null来强制取消排序,禁用查询结果集的排序;PawSQL识别并进行了重写。

譬如下面的例子中

SELECT l_orderkey, sum(l_quantity)
FROM lineitem
GROUP BY l_orderkey;

在MySQL 5.x版本中,group by l_orderkey会引起默认排序, 可以通过添加order by null来避免该排序。

SELECT l_orderkey, sum(l_quantity)
FROM lineitem
GROUP BY l_orderkey
ORDER BY NULL;
默认预警级别
  • 警告

触发条件
  • MySQL数据库,版本低于8.0

  • 存在分组字段,且无排序字段

2. GROUP字段中有表达式导致索引失效

规则描述

数据库可以利用索引的有序性来避免GROUP子句中列的排序,从而提升SQL的性能。但是如果Group字段是一个表达式或函数,则可能无法利用索引来进行排序。

默认预警级别
  • 提示

触发条件
  • 存在分组字段,字段为表达式或函数

3. ORDER字段中有表达式导致索引失效

规则描述

数据库可以利用索引的有序性来避免ORDER子句中列的排序,从而提升SQL的性能。但是如果ORDER字段是一个表达式或函数,则可能无法利用索引来进行排序。

默认预警级别
  • 提示

触发条件
  • 存在排序字段,字段为表达式或函数

4. 排序字段方向不同导致索引失效

规则描述

ORDER BY 子句中的所有表达式需要按统一的 ASC 或 DESC 方向排序,才能利用索引来避免排序;如果ORDER BY 语句对多个不同条件使用不同方向的排序无法使用索引。

默认预警级别
  • 提示

触发条件
  • 有多个排序字段

  • 存在两种排序方向

5. 避免对长字段进行分组

规则描述

在数据库中,分组通常是通过排序或哈希来做,如果需要分组的行数比较多,那么单个字段长度会较大的影响分组效率。此规则可以通过比较分组字段的长度是否超过用户输入的阈值。如果超过阈值,则会进行预警。

默认预警级别
  • 预警

触发条件
  1. GROUP字段类型为CHAR/VARCHAR,且字段长度超过阈值

  2. 或GROUP字段类型为CLOB/TEXT/TINYTEXT/MEDIUMTEXT/LONGTEXT

6. 避免对条件字段使用负向查询

规则描述

负向查询指的是否定查询,即<>NOT IN 等否定条件。此类查询无法利用索引进行快速定位。

默认预警级别
  • 警告

触发条件
  • SQL中的条件为否定条件。

7. 表连接缺少链接条件

规则描述

表连接缺少链接条件会导致结果集变成两个表的笛卡尔集,数据量巨大,且有较大可能性不符合开发者的预期。PawSQL会检查此类写法,并进行提醒。

默认预警级别
  • 提示

触发条件
  • 表连接缺少链接条件

8. 分区表没有使用分区字段过滤

规则描述

在访问分区表时,没有使用分区字段进行过滤,会导致需要访问所有分区。

默认预警级别
  • 提示

触发条件
  • 表是分区表

  • SQL中不存在在分区键的过滤条件

9. 过滤条件中须使用主键或索引列

规则描述

如果一个表的过滤条件上没有主键或索引,则会导致全表扫描。

默认预警级别
  • 提示

触发条件
  • SQL中存在过滤或关联条件

  • 过滤或关联条件是可索引条件

  • 可索引条件不存在任何可利用的索引(包括主键索引)

10. 查询中表连接的个数超过阈值

规则描述

在单机版数据库执行计划的规划中,表连接的顺序和连接的方法是数据库优化器最重要的规划内容。表连接数目的增加将几何级数地增加数据库优化器对于最优执行计划的搜寻空间,导致生成执行计划的时间比较长,且容易生成性能较差的执行计划。所以PawSQL检测查询中表连接的数目是否超过某个阈值,并提醒用户可能的风险。在PawSQL中,阈值的默认值是5,用户可以在创建优化任务时修改此阈值。

默认预警级别
  • 警告

触发条件
  • 单个查询块中表连接的个数超过阈值(默认为5)

11. 避免查询排序时指定COLLATION

规则描述

可以在SQL中指定排序字段所使用的COLLATION,譬如下面的SQL

select * from customer c order by c_name COLLATE utf8mb4_0900_bin

这样的话,该SQL将无法利用索引的有序性来避免排序。

默认预警级别
  • 警告

触发条件
  • 显式的指定排序的COLLATION

12.避免对长字段进行排序

规则描述

在计算机中,排序是一个OlnN时间复杂度的操作,如果需要排序的行数比较多,那么单个字段长度会较大地影响排序效率。此规则可以通过比较排序字段的长度是否超过用户输入的阈值。如果超过阈值,则会进行预警。

默认预警级别
  • 预警

触发条件
  1. ORDER字段类型为CHAR/VARCHAR,且字段长度超过阈值

  2. 或ORDER字段类型为CLOB/TEXT/TINYTEXT/MEDIUMTEXT/LONGTEXT

13. 避免使用标量子查询

规则描述

标量子查询返回单行单列的一个值,它可以出现在SQL中任何单值出现的地方。标量子查询通常需要在执行时才能确定其是否只返回单行值,且其通常为相关子查询。容易引起运行时错误,以及性能问题。

默认预警级别
  • 提示

触发条件
  • SQL中出现标量子查询

14. 避免更新主键的值

规则描述

在MySQL InnoDB引擎或是SQL Server数据库中,数据存储方式都是以主键的方式组织的。在这种情况下,对主键的更新会涉及到对数据在磁盘上物理组织的调整,而且也涉及到主键值唯一性的检查,在表数据量非常大的情况下,更新的代价可能非常之大。

默认预警级别
  • 警告

触发条件
  • 更新主键的值

  • MySQL InnoDB引擎或是SQL Server数据库

16. 避免更新唯一约束的值

规则描述

对唯一性约束的列的值的更新,需要对它进行唯一性检查,在表数据量非常大的情况下,更新的代价可能非常大。

默认预警级别
  • 警告

触发条件
  • 更新唯一性列的值

17. DELETE/UPDATE禁止使用表连接

规则描述

表连接的误操作可能导致结果集的行非常大,对大结果集的DELETE/UPDATE可能会非常耗时,锁表时间较长,也难以对操作进行回滚。

默认预警级别
  • 警告

触发条件
  • DELETE/UPDATE存在多表

18. 避免使用不必要的内置函数

规则描述

某些内置函数可能不满足业务或是计算上的某些规范要求。通过配置该规则可以指定业务中需要禁止使用的内置函数。

默认预警级别
  • 提示

触发规则
  • 函数列表中的函数名称出现在SQL中。

关于PawSQL

PawSQL专注数据库性能优化的自动化和智能化,支持MySQL,PostgreSQL,Opengauss等,提供的SQL优化产品包括

  • PawSQL Cloud,在线自动化SQL优化工具,支持SQL审查,智能查询重写、基于代价的索引推荐,适用于数据库管理员及数据应用开发人员,

  • PawSQL Advisor,IntelliJ 插件, 适用于数据应用开发人员,可以IDEA/DataGrip应用市场通过名称搜索“PawSQL Advisor”安装。

  • PawSQL Engine, 是PawSQL系列产品的后端优化引擎,可以以docker镜像的方式独立安装部署,并通过http/json的接口提供SQL优化服务。

  • PawSQL Ora2pg/PawsQL Ora2op,Oracle语法的SQL应用转换为PostgreSQL和openGauss语法的工具。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vertica单点更改服务器ip

需求 服务器网段调整&#xff0c;将ip&#xff1a;192.168.40.190收回&#xff0c;使用ip&#xff1a;192.168.40.200 默认情况下&#xff0c;节点 IP 地址和导出 IP 地址配置相同的 IP 地址。导出地址是网络上有权访问其他 DBMS 系统的节点的 IP 地址。使用导出地址从 DBMS …

CodeFuse新开源模型荣登Big Code评测榜首!

使用多任务高效微调框架MFTCoder&#xff0c;以DeepSeek-Coder-33b模型为底座&#xff0c;微调获得的CodeFuse-DeepSeek-33b模型在Big Code Models Leaderboard代码大模型榜单上以43.58% WinRate成为新晋榜首&#xff0c;同时模型在NLP任务上也取得了很好的表现。本文我们将介绍…

【C++】类与对象(二)特殊成员函数

前言 类与对象&#xff08;二&#xff09; 文章目录 一、特殊成员函数二、构造函数三、析构函数四、拷贝构造函数五、拷贝赋值运算符 一、特殊成员函数 如果在类的声明中未显式提供某个成员函数的定义&#xff0c;编译器会自动生成一个默认实现。 这包括默认构造函数、默认析构…

怎么制作出圈的虚拟数字人城市宣传短片?

如今&#xff0c;中国城市面临一个从To B&#xff08;企业客户&#xff09;、To G&#xff08;政府客户&#xff09;到To C&#xff08;一般客户&#xff09;的转变。其中&#xff0c;城市宣传片作为与C端沟通的最佳途径&#xff0c;一个“吸睛”的城市短片&#xff0c;可以有效…

揭秘支付宝小程序开发:从零到一,轻松掌握开发流程!

目录 1、介绍支付宝小程序开发 1.1 什么是支付宝小程序 1.2 支付宝小程序与其他小程序的区别 1.3 支付宝小程序的优势 2、准备工作 2.1 注册支付宝小程序开发者账号 2.2 下载支付宝小程序开发工具 2.3 了解支付宝小程序的基本概念和架构 3、开发环境搭建 3.1 安装并配…

如何在 Ubuntu 中安装 Microsoft Edge 浏览器

微软终于聪明了一回&#xff0c;也学会了「打不过就加入」。Microsoft Edge 浏览器的 Linux 稳定版已经于 2020 年 10 月 23 日发布&#xff0c;并提供给 Linux 发行版使用。除了官方 Edge APT 源以外&#xff0c;还提供了.deb和.rpm格式的安装包。 Microsoft Edge 基于 Chrom…

深度学习快速入门--7天做项目

深度学习快速入门--7天做项目 0. 引言1. 本文内容2. 深度学习是什么3. 项目是一个很好的切入点4. 7天做项目4.1 第一天&#xff1a;数据整理4.2 第二天&#xff1a;数据处理4.3 第三天&#xff1a;简单神经网络设计4.4 第四天&#xff1a;分析效果与原因4.5 第五天&#xff1a;…

【MyBatis】快速入门MyBatis(保姆式教学),你值得一看

文章目录 &#x1f4c4;前言一. Mybatis简介✈️1. 什么是Mybatis&#x1f680;2. 为什么使用Mybatis 二. Mybatis快速入门&#x1f346;1. mybatis使用前准备1.1 创建springboot项目并引入相关依赖1.2 在 application.ym中进行数据源的配置1.3 创建数据表&#xff0c;准备表数…

【css】自定义列表项标记(图片、符号、表情)

1. 列表项标记是图片 ul{li {list-style: none;padding-left: 20px; /* 设置左边距&#xff0c;以容纳图标 */display: flex;align-items: center;/* 使小图标和文字高度对齐 */}li::before {content: ;display: inline-block;width: 20px; /* 设置容器宽度 */height: 20px; /*…

java学习02运算符

一 算术运算符 1.运算符和表达式 运算符 就是对常量或者变量进行操作的符号 表达式 用运算符把常量或者变量连接起来的&#xff0c;符合Java语法的式子就是表达式。 比如&#xff1a;a b 2.算术运算符 加减乘 package com.itheima.arithmeticoperator;public class Ar…

笔记本从零安装ubuntu系统+多种方式远程控制

文章目录 前言ubuntu启动盘Windows远程Ubuntu安装XrdpXrdp卡顿问题解决Xrdp 二次登录会死机的问题Xrdp 卡顿问题 MobaXtermRustDesk 外网远程VNC 远程SSH远程其它设置 总结 前言 我有台老笔记本&#xff0c;上大学第一年的时候买的&#xff0c;现在已经不怎么好用了。打算刷个…

GNSS定位技术总结与PPP定位技术

1.统一观测值方程 2.PPP方程构建 站间单差方程如下&#xff1a; 同样的&#xff0c;设计矩阵也更加庞大&#xff1a; 站间单差消除了卫星轨道、卫星钟、电离层、对流层以及卫星端的伪距和载波硬件延迟的影响。但在PPP中&#xff0c;我们无法通过站间单差消除这些影响&#xff…

虚拟机设置静态ip

有时候搭环境需要局域网&#xff0c;设置一下虚拟机静态ip&#xff0c;这里做个记录&#xff1a; 这里我用的是ubuntu18.04的虚拟机&#xff0c;安装完成之后&#xff0c;点击进入设置 这里设置一下桥接模式 这个时候输入ifconfig&#xff0c;就是和主机一个网段了&#xff…

Tomcat多实例配置与tomcat反向代理集群

目录 Tomcat多实例配置 1.首先配置Tomcat单实例 2.tomcat多实例配置 1.1复制单实例tomcat 1.2修改端口&#xff0c;以启动多实例。多实例之间端口不能一致 1.3对比文件不同之处 3.启动tomcat 4.检查端口查看是否启动: 5.测试浏览器访问 二、tomcat反向代理集群 1、负载…

【AI】Chinese-LLaMA-Alpaca-2 7B llama.cpp 量化方法选择及推理速度测试 x86_64 RTX 2060 6G 显存太小了

环境 操作系统 CPU 内存 生成量化版本模型 转换出q4_0 q4_k q6_k q8_0模型 cd ~/Downloads/ai/llama.cpp sourvce venv/bin/activate ~/Downloads/ai/llama.cpp/quantize /home/yeqiang/Downloads/ai/chinese-alpaca-2-7b/ggml-model-f16.gguf /home/yeqiang/Downloads/ai/ch…

elk之安装和简单配置

写在前面 本文看下elk的安装和简单配置&#xff0c;安装我们会尝试通过不同的方式来完成&#xff0c;也会介绍如何使用docker&#xff0c;docker-compose安装。 1&#xff1a;安装es 1.1&#xff1a;安装单实例 下载es安装包 在这里 下载&#xff0c;下载后解压到某个目录…

使用 Node.js 和 Cheerio 爬取网站图片

写一个关于图片爬取的小案例 爬取效果 使用插件如下&#xff1a; {"dependencies": {"axios": "^1.6.0","cheerio": "^1.0.0-rc.12","request": "^2.88.2"} }新建一个config.js配置文件 // 爬取图片…

企业内部知识库搭建原来这么轻松,靠这五步马上完成

在信息爆炸的时代&#xff0c;有效地管理企业内部的巨量信息&#xff0c;已经成为企业效率提升和竞争优势形成的关键。而一套完善的企业内部知识库&#xff0c;就是解决这个问题的第一步。那么如何建立起一个功能完备、使用便捷的知识库呢&#xff1f;只需要五步&#xff0c;你…

Leetcode—1828. 统计一个圆中点的数目【中等】

2024每日刷题&#xff08;一零五&#xff09; Leetcode—1828. 统计一个圆中点的数目 实现代码 class Solution { public:vector<int> countPoints(vector<vector<int>>& points, vector<vector<int>>& queries) {vector<int> a…

npm 被滥用 -- 有人上传了 700 多个武林外传切片视频

Sonatype 安全研究团队最近曝光了一起滥用 npm 的案例 —— 他们发现在 npm 上托管的 748 个软件包实际上是视频文件。 据介绍&#xff0c;这些软件包每个大小约为 54.5MB&#xff0c;包名以 “wlwz” 为前缀&#xff0c;并附带了代表日期的数字。根据时间戳显示&#xff0c;这…