SQL调优的几个方法

2023-11-14

1.为什么调优,好处是什么? 

SQL语句在编写之后,对于数据量较少的表基本没有什么性能上的需求,但是如果考虑到性能方面的话,SQL语句优化就是必须的。

2.如何调优?调有点方法有哪些?

 

1、对查询进行优化,应尽量避免全表扫描,首先考虑在where及order by上建立索引。

 

2、应尽量避免在where子句中进行以下操作:对字段进行null判断;使用!=或<>操作符;使用or连接条件;使用in或not in;使用like;等号左侧使用算术运算;对字段进行函数运算等。以上操作将导致引擎放弃索引而进行全表扫描。

 

3、不要写一些没有意义的查询,如生成一个空表。

 

4、使用exists替代in,用not exists替代not in。not in 是低效的,因为它对子查询中的表执行了一个全表遍历,他执行了一个内部的排序和合并。select num from a where exists(select 1 from b where num=a.num)

 

5、对只含数值信息的字段尽量使用数值型代替字符型,否则会降低查询和连接性能。

 

6、尽可能使用varchar代替char,节约存储空间,提高效率。

 

7、尽量用具体字段代替*进行查询。

 

8、在使用索引字段作为条件时,如果索引是复合索引,必须使用该索引的第一个字段作为条件才能保证系统使用该索引。

 

9、当索引中有大量重复数据时,索引是无效的。

 

10、当进行update或insert操作时,索引的存在会降低该操作的效率。

 

11、尽量避免频繁创建或删除临时表,减少系统资源消耗。

 

12、在新建临时表时,如果一次性插入数据量很大,那么可以使用select into代替create table,避免产生大量log,提高效率。

 

13、如果使用到了临时表,在存储过程的最后务必将所有的临时表显示的删除,先truncate table ,然后drop table,避免系统表长时间锁定。

 

14、尽量避免使用游标,因为游标效率较差,如果游标操作的数据超过1万行,那么就应该考虑改写。

 

15、对于小型数据集使用fast_forward游标要优于其他逐行处理方法,尤其是在必须引用几个表才能获取所需要的数据时。

 

16、表名顺序。选择最有效率的表名顺序,from后面先跟大表,再跟小表,因为from子句中写在最后的表被优先处理,from后跟多个表的情况下,应该选择记录条数最少的表作为优先处理的表;

 

17、where子句连接顺序。那些可以过滤最大数量记录的条件必须写在where子句的末尾;

 

18、高效删除重复记录。最高效的删除重复记录方法 ( 因为使用了ROWID)例子:delete from emp a where a.rowid>(select min(b.rowid) from emp b where a.emp_no=b.emp_no);

 

19、使用truncate替代delete。当用delete删除表中记录时,回滚段rollback用来被存放可以被恢复的信息,如果你不执行commit,oracle会将数据恢复到删除之前的状态;当运行truncate时,回滚段不再存放任何可被恢复的信息,当运行truncate时,数据不再被恢复,此时很少的资源被调用,执行时间也会很短;

 

20、尽量多使用commit。随着commit的多次使用,系统资源被释放,性能会提高;

 

21、用where子句替换having子句。having只会在检索出所有记录之后才对结果集进行过滤。on、where、having这三个都是删选条件的子句,on最先执行,where次之,hiving最后;on先把不符合条件的记录过滤才进行统计,它可以减少中间运算要处理的数据,on的使用仅限于多表连接;where也是过滤数据后才进行sum;hiving是在计算之后才启作用;

 

22、使用表的别名。当sql语句中连接多个表时,请使用表的别名并用别名前缀识别每个column,这样可以减少sql解析时间,避免歧义;

 

23、用>=替代>

 

高效:SELECT * FROM EMP WHERE DEPTNO >=4 低效: SELECT * FROM EMP WHERE DEPTNO >3

 

前者DBMS将直接跳到第一个DEPT等于4的记录而后者将首先定位到DEPTNO=3的记录并且向前扫描到第一个DEPT大于3的记录。

 

24、用union all替换union。当SQL语句需要UNION两个查询结果集合时,这两个结果集合会以UNION-ALL的方式被合并,然后在输出最终结果前进行排序。如果用UNION ALL替代UNION,这样排序就不是必要了。效率就会因此得到提高。

 

25、当使用join(inner join或left join)操作时,就应该是小表在前,大表在后。把重复关联键少的表放在join前面做关联可以提高join的效率。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL调优的几个方法 的相关文章

  • 使用 SQL 确定子网掩码的 cidr 值

    我想找到一种方法来执行 SQL 查询 该查询将计算存储在数据库中的子网掩码的 cidr 位表示 例如 我在数据库中存储了 255 255 255 0 或其十进制值 4294967040 我想通过查询进行选择并返回 24 表示 我已经执行了类
  • 无法将方法组“Read”转换为非委托类型“bool”

    我正在尝试使用SqlDataReader检查条目是否存在 如果存在则返回ID 否则返回false 当我尝试编译时 出现错误 无法将方法组 Read 转换为非委托类型 bool 我一直在遵循在 VB 中找到的示例 但似乎翻译可能不正确 pri
  • 如何将存储过程中的值返回到 EF

    我试图通过 EF 调用存储过程并从存储过程中检索返回值 我用过this https stackoverflow com questions 6861737 executesqlcommand with output parameter an
  • Linq 到自定义 SQL

    好的 我有一个带有巨大表的数据库 超过 100 万条记录和 50 多个列 我知道它不是最佳的 但它是我必须处理的 所以我需要运行限制返回数据量的查询 现在我的问题是这样的 我有一些运行并返回数据的自定义查询 用户可以通过选择将生成谓词模板并
  • 将数据从 MS SQL 导入 MySQL

    我想从 MS SQL Server 导入数据 通过某种正则表达式运行它以过滤掉内容 然后将其导入 MySQL 然后 对于每个查询 我希望显示来自第三个数据库的相关图像 明智地导入和链接 最简单的方法是什么 谢谢 澄清 它是一个 PHP 应用
  • 如何将特定行保留为查询(T-SQL)的第一个结果?

    我正在编写一个 SQL 查询来获取 Report Builder 3 0 中报表的参数列表 我需要在结果中添加一个带有值 All 的额外行 如下所示 SELECT All UNION SELECT DISTINCT Manager FROM
  • SQL where 连接集必须包含所有值,但可以包含更多值

    我有三张桌子offers sports和连接表offers sports class Offer lt ActiveRecord Base has and belongs to many sports end class Sport lt
  • Django 模型 - 外键作为主键

    我有以下2张表 在 models py 中 class Foo models Model uuid models CharField UUID primary key True default uuid4 and class FooExt
  • 如何在 SQL 中存储目标(例如 RPG Quest)

    今天有人问我他们应该如何将任务目标存储在 SQL 数据库中 在这种情况下 请考虑角色扮演游戏 目标可能包括以下一些内容 发现 地点 杀死 n MOB 类型 获取 对象 的 n 个 实现 技能组 中的 技能 你在角色扮演游戏中获得的所有其他东
  • 获取列名称以及 JSON 响应

    我有三个实体类 我编写了包含两个表的联接的查询 表 费用类别 Entity Table name ExpensesCategories public class ExpensesCategories Id GeneratedValue st
  • 什么时候应该使用 XML 而不是 SQL? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 显式与隐式 SQL 连接

    显式内连接与隐式内连接之间有效率差异吗 例如 SELECT FROM table a INNER JOIN table b ON a id b id vs SELECT a b FROM table a table b WHERE a id
  • 如何以编程方式使用包含多列的 where-in 子句执行 PostgreSQL 查询?

    我的查询是这样的 select from plat customs complex where code t code s in 01013090 10 01029010 90 它在 psql 控制台中运行良好 我的问题是如何在客户端代码中
  • PostgreSQL 如何创建数据库或模式的副本?

    有没有一种简单的方法可以在 PostgreSQL 8 1 中创建数据库或模式的副本 我正在测试一些软件 它对数据库中的特定模式进行大量更新 我想复制它 以便我可以与原始版本进行一些比较 如果它位于同一服务器上 则只需使用带有 TEMPLAT
  • 将错误保存到 MySQL 数据库

    我有一个 php 查询来更新 MySQL 数据库 请参见下文 sql update hr payroll set payroll number payroll number tax code tax bacs ref bacs ref pa
  • PostgreSQL:有效地将 JSON 数组拆分为行

    我有一个表 表 A 其中包含一个包含 JSON 编码数据的文本列 JSON 数据始终是一个包含一到几千个普通对象的数组 我有另一个表 表 B 其中有几列 包括数据类型为 JSON 的列 我想从表 A 中选择所有行 将 json 数组拆分为其
  • 如何查找列中未使用的ID? [复制]

    这个问题在这里已经有答案了 可能的重复 SQL查询查找丢失的序列号 https stackoverflow com questions 1057389 sql query to find missing sequence numbers 我
  • 如何避免这两个 SQL 语句之间出现死锁?

    我有两个存储过程在单独的线程中运行 在 SQL Server 2005 上运行 一个过程将新行插入到一组表中 另一个过程从同一组表中删除旧数据 这些过程在表上遇到了死锁DLevel and Model 这是架构 source barrams
  • Mysql获取特定表的最后一个id

    我必须从特定的插入表中获取最后的插入 ID 可以说我有这个代码 INSERT INTO blahblah test1 test 2 VALUES test1 test2 INSERT INTO blahblah2 test1 test 2
  • 返回年份数组作为年份范围

    我正在尝试查询一个包含以下内容的表character varying 年份列 并将这些年份作为逗号分隔的年份范围字符串返回 年份范围将由数组中存在的连续年份确定 不连续的年份 年份范围应以逗号分隔 数据类型的原因是character var

随机推荐

  • Linux下动态链接库的使用

    1 所谓链接 也就是说编译器找到程序中所引用的函数或全局变量所存在的位置 一般来说 程序的链接分为静态链接和动态链接 静态链接就是把所有所引用到的函数或变量全部地编译到可执行文件中 动态链接则不会把函数编译到可执行文件中 而是在程序运行时动
  • 固态硬盘Ghost安装Windows 10无法引导的问题

    机器配置如下 电脑型号 技嘉 B360M POWER 台式电脑 操作系统 Windows 10 64位 DirectX 12 处理器 英特尔 Core i7 8700 3 20GHz 六核 主板 技嘉 B360M POWER 英特尔 PCI
  • 东北大学acm暑期夏令营结构体

    NEUQ ACM CAMP B011 结构体 枚举 NEUQ ACM CAMP B011 结构体 枚举 开始时间 2022 08 18 08 07 00 结束时间 2022 08 31 23 59 00 答题时长 19672分钟 答卷类型
  • 解决Windows server 2003不认U盘

    解决Windows server 2003不认U盘或移动硬盘 2009 05 18 23 08 47 标签 电脑 usb接口 移动硬盘 盘符 it 分类 电脑网络 答案一 快速解决办法 一 U盘以及移动硬盘自动装载也是一样的 WINDOWS
  • Exception in thread “main“ java.lang.ArrayIndexOutOfBoundsException: 6问题

    今天在java中出现了一个这样的问题 Exception in thread main java lang ArrayIndexOutOfBoundsException 6 at com wyt demo3 Role attack Role
  • valgrind android编译、安装

    valgrind android编译 安装 参见valgrind 3 12 0 tar bz2中的README android文件 以下步骤 遵循README android说明 注意VALGRIND LIB是程序内部环境变量 export
  • static在C和C++中的区别

    以下内容参考博客 https www cnblogs com Manual Linux p 8870038 html static在C语言中的区别 1 static修饰变量的时候 静态局部变量只被执行一次 延长了整个局部变量的生命周期 直到
  • linux下RDP客户端及服务器

    tsclient redsktop remmina gt 对ubuntu支持的非常不错 XRdp 集合vnc作为rdp服务器端使用
  • Java注释及分隔符 基础知识

    一 用于单行注释 用于多行注释 文档注释 文档注释属于多行注释的一种 二 空白符 空格 制表符 t 走页换页 f 回车 r 换行 n
  • 使用python指定个数随机生成一组混合字符集

    今天做测试想生成混合的id或者密码 思考了有很多方式 比如可以加入datetime库 然后截取一部分 或者随机生成一部分 进行替换 添加 这里采取一种简单易懂的方式 一 运行结果示范 就是这种效果 生成多少位数 18 ry3Gu aVr8V
  • STM32 基础系列教程 30 - 文件系统

    前言 学习stm32中FATFS 文件系统的基础使用 学会文件的打开及读写删除等基本操作 理解文件系统基本概念 示例详解 基于硬件平台 STM32F10C8T6最小系统板 MCU 的型号是 STM32F103c8t6 使用stm32cube
  • 学习HC-SR04超声波测距模块,代码附带卡尔曼滤波

    硬件引脚 VCC 供5V的电压 一定要是5v GND 接地 Trig HC SR04超声波测距模块上的触发引脚 用于向模块发送一个10微秒的高电平触发信号 触发模块开始进行距离测量 Echo 用于接收超声波回波信号的引脚 工作原理 使用HC
  • js根据本地文件路径上传文件(流上传)

    最近使用vue做了个项目 把本地指定url下的png图片上传 废话不多说 直接上代码 var fs require fs 需要引入nodejs中的文件操作部分 var http require http 需要引入nodejs中http请求部
  • 软件自动化测试工具/平台的挑战

    今天在微信读书偶然读到 高效自动化测试平台 设计与开发实战 作者徐德晨和茹炳晟 该书1 2章节详细讲述了软件自动化测试工具 平台的七个挑战 下面结合一站式开源持续测试平台项目MeterSphere详解这七个挑战 GitHub metersp
  • linux系统编程-1、基础知识

    前言 Linux系统编程的基础系列文章 随着不断学习会将一些知识点进行更新 前期主要是简单了解和学习 文章目录 shell bash 命令和路经补齐 历史记录 目录和文件 类Unix系统目录结构 用户目录 ls cd which pwd m
  • 请用美丽欢呼-------Day38

    周末 双休 疯了两天 敲了寥寥的代码 却没少看了相关的文章 这电子书大行于世的年代 对工具的漠然简直就是对生命的亵渎 颠簸的公交车上算是告别了YY的惬意 这生活 感觉傻了点 可真够味 原本只是想写篇 html的发展历程 的 可XHTML 2
  • Java并发编程:并发容器之CopyOnWriteArrayList(转载)

    http www cnblogs com dolphin0520 p 3938914 html 原文链接 http ifeve com java copy on write Copy On Write简称COW 是一种用于程序设计中的优化策
  • 基于YOLOv8模型和CrowdHuman数据集的行人检测系统(PyTorch+Pyside6+YOLOv8模型)

    摘要 基于YOLOv8模型和CrowdHuman数据集的行人目标检测系统可用于日常生活中检测与定位行人 Human 利用深度学习算法可实现图片 视频 摄像头等方式的目标检测 另外本系统还支持图片 视频等格式的结果可视化与结果导出 本系统采用
  • python 利用表格批量修改文件夹(包括子文件夹)下所有文件名

    首先是获得需要修改文件的路径放入xlsx中 我一般直接在系统的搜索框中搜索 然后全选复制路径 偷个小懒 也可以再写个自动遍历所有文件获取地址 点击这个复制路径即可复制全部选中文件的路径 直接复制在表格第一列即可 便于读取 然后按照自己实际的
  • SQL调优的几个方法

    1 为什么调优 好处是什么 SQL语句在编写之后 对于数据量较少的表基本没有什么性能上的需求 但是如果考虑到性能方面的话 SQL语句优化就是必须的 2 如何调优 调有点方法有哪些 1 对查询进行优化 应尽量避免全表扫描 首先考虑在where