SQL语句调优汇总
1.插入数据的表或临时表,预先创建好表结构,能够加快执行速度
2.where 条件判断的字段以及连接查询的条件字段 都添加上索引 能够加快执行速度
3.尽量避免使用 like ,类似 like ‘XX%’ 或like ‘%XX’ 可以使用 left(varchar,length) == ‘XX’ 来替代,可以加快执行速度
4.循环改批量处理
1).应用代码端一记 for 循环再恶心点的每次打开关闭连接,跑个几分钟,数量大点几小时。请把你的每次for循环出来的结果放在一个datatable,list啥的,不要找到一条就往数据库写一条!
2).数据库中的游标也是差不多的道理,如果有可能不用游标循环一条一条处理,请尽量不要使用。如果自己认为必须用,也请问问别人是否可以有其他方式做批量!
3).如果没法避免一条一条的写入,那么在处理前显示开启一个事务 begin tran 在处理完成后 commit 这样也要比不开显示事务会快很多!凡事有利有弊,这种显示开启大事务要保证的整体的过程不会执行特别长的时间,如果执行的操作特别多而且时间长就是灾难了!
5.降低语句的复杂性
把一些能拆分出来的尽量拆分出来放入临时表或者表变量中,比如先把条件筛选性较强的几张表关联,然后把结果放入临时表,在用临时表和其他表关联。可以理解成我有10张表关联,我先拿5张表出来关联,然后把结果放入临时表,再跟另外5张表关联。这样这个查 询的复杂度由10张表的联合变成 5+6,这样降低了复杂语句复杂度。复杂视图也是如此,在视图和外层关联前,放入临时表,再跟外层关联。子查询也是如此,可以分离出来成为临时表的子查询,先分离出来。
6.避免重复读取
1).多个存储过程顺序执行,每个存储过程都需要读取同一聚合数据,那么就将它们整合成1个存储过程,对聚合数据只读取一次。
2).考虑聚合数据的常用性,考虑使用临时表进行处理,大量数据写入临时表时,一定要用 先create 再 insert 的方式,不要直接使用 select into 临时表的方式,否则就是灾难了!
7.为必要的字段创建索引
1).创建的索引列不可以带函数,不可以参与计算 类似:where productID/2 = @a ,不能有隐式转换。
2).尽量把 where 条件中的字段建成一个组合索引,并且包含要查询 select 中的字段。
8.只返回必要的数据
1).不要写SELECT * 的语句,而是选择你需要的字段。
2).当在SQL语句中连接多个表时, 请使用表的别名并把别名前缀于每个Column上.这样一来,就可以减少解析的时间并减少那些由Column歧义引起的语法错误。
3).where 条件要尽量的多且保证高筛选性。
4).业务中很常见要返回大批量数据到前端,但是这些数据真的都是必要的么?前端是否可以加一些默认条件呢?
9.减少不必要的操作
1).杜绝不必要的表连接,多一个表链接代表多很大部分开销。
2).减少不必要的条件判断,很多时候前台传入为空值得时候 后台语句被写成XX=XX OR XX IS NULL OR XX LIKE OR ...OR ...OR 等。这是比较经典的问题了,请加入判断在拼入最后的条件!
3).你的语句需要去重复么? distinct 、union等操作
4).LEFT JOIN 和 inner join的区别,是否真的需要left join,否则选用inner join 来减少不必要的数据返回。
5).order by 你的语句是否需要排序?排序是否可以通过索引来降低性能消耗? 我见过竟然插入数据也带着order by的 !
10.尽量早的筛选
1).最经典的例子就是where 和 having的区别,看过语句执行顺序你应该已经明白了。能写在where 中不要放在having中。
2).使用临时表降低语句复杂性,要降低临时表的数据量,也就是要把有条件的表尽量关联并做成临时表。
3).前面提到的隐式转换,索引字段使用计算或函数,也会导致数据不能尽早筛选。
11.常用的写法误区(以下都是网上片面结论)
所有别人提到的方法到底有无效
- or 要用union all 代替 (or是很常规的一种写法,情况分很多种,一个表的两个条件用 a.a =X or a.a = XX ,一个表两个字段用 a.a =X or a.b = x,两个不同表字段用 a.a = X or b.a = X 这是网上说的union all代替的)
- 避免使用 in、not in (数据量小的时候不会有问题,如果数据量大可能影响性能,数据量大处理方式先把in 中的数据放入临时表)
- 事务操作过程要尽量小,能拆分的事务要拆分开来。(前文中提到的例子,有些情况循环写入下,显示开启一个大事务会有很大帮助)
- 使用with(nolock)查询语句不会阻塞 (一般情况下是这样,但是如果有架构修改或快照发布等使用with(nolock)也会阻塞)
- 用exists 代替 in (情况也很复杂不能一概而论)
SQL语句调优汇总的更多相关文章
- SQL语句调优-基础知识准备
当确定了应用性能问题可以归结到某一个,或者几个耗时资源的语句后,对这些语句进行调优,就是数据库管理员或者数据库应用程序开发者当仁不让的职责了.语句调优是和数据库打交道的必备基本功之一. 当你面对一个“ ...
- MySQL千万级多表关联SQL语句调优
本文不涉及复杂的底层数据结构,通过explain解释SQL,并根据可能出现的情况,来做具体的优化. 需要优化的查询:使用explain 出现了Using temporary: ...
- MySQL百万级、千万级数据多表关联SQL语句调优
本文不涉及复杂的底层数据结构,通过explain解释SQL,并根据可能出现的情况,来做具体的优化,使百万级.千万级数据表关联查询第一页结果能在2秒内完成(真实业务告警系统优化结果).希望读者能够理解S ...
- SQL语句调优三板斧
改装有顺序------常开的爱车下手 你的系统中有成千上万的语句,那么优化语句从何入手呢 ? 当然是系统中运行最频繁,最核心的语句了.废话不多说,上例子: 这是一天的语句执行情况,里面柱状图表示的是对 ...
- SQL语句调优相关方法
SQL语句慢的原因:1,数据库表的统计信息不完整2,like查询估计不准确调优方法:1,查看表中数据的条数:2, explain analyze target_SQL;查看SQL执行计划:比较SQL总 ...
- 【初学Java学习笔记】SQL语句调优
1, 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2,应尽量避免在 where 子句中对字段进行 null 值判断,创建表时NULL是默认 ...
- SQL语句调优 - 统计信息的含义与作用及维护计算
统计信息的含义与作用 ...
- SQL语句调优 - 索引上的数据检索方法
如果一张表上没有聚集索引,数据将会随机的顺序存放在表里.以dbo.SalesOrderDetail_TEST为例子.它的上面没有聚集索引,只有一个在SalesOrderID上的非聚集索引.所以表格的每 ...
- SQL 语句调优 where 条件 数据类型 临时表 索引
基本原则 避免全表扫描 建立索引 尽量避免向客户端返回大数据量,若数据量过大,应该考虑相应需求是否合理 尽量避免大事务操作,提高系统并发能力 使用基于游标的方法或临时表方法之前,应先寻找基于集的解决方 ...
随机推荐
- JAVAORM框架之Mybatis (Ibatis) 详解
目录 Mybatis基础概念 Mybatis开放方式演进 Mybatis框架核心要点 关联查询 延迟加载(懒加载) 动态SQL Mybatis缓存 Mybatis逆向工程 PageHelper分页插件 ...
- Memcached 简单利用和简单了解(Mac的安装和使用)
Memcached 是一种用于分布式应用的一种缓存机制.应用也比较广泛.这里来学习一下. 首先Memcached 是分布式网站架构都需要用到的缓存机制.缓存就是服务器利用多余的空间上开辟了一个储存空间 ...
- 视觉slam十四讲开源库安装教程
目录 前言 1.Eigen线性代数库的安装 2.Sophus李代数库的安装 3.OpenCV计算机视觉库的安装 4.PCL点云库的安装 5.Ceres非线性优化库的安装 6.G2O图优化库的安装 7. ...
- 第九次CSP第四题 - 压缩编码
给定一段文字,已知单词a1, a2, …, an出现的频率分别t1, t2, …, tn.可以用01串给这些单词编码,即将每个单词与一个01串对应,使得任何一个单词的编码(对应的01串)不是另一个单词 ...
- gis 相关资料
--gis原理学习 http://group.cnblogs.com/GIS/best-1.html http://www.cnblogs.com/SuperXJ/tag/移动GIS/ --gis坐标 ...
- hadoop第一部分-安装、测试
一.hadoop安装(本地模式及伪分布式安装) hadoop历史版本下载网站:http://archive.apache.org/dist/运行模式: 本地模式 yarn模式 hadoop ...
- win7操作系统说明
· 能够使用windows7操作系统成为了许多电脑用户的一大喜悦之事,相比之前的Vista系统,windows7系统真的是好看了,快了,好用了,但你是否担心自己的windows7系统就像新安装其他Wi ...
- django模板语言的注释
就像HTML或者Python,Django模板语言同样提供代码注释. 注释使用 {# #} : ? 1 {# This is a comment #} 注释的内容不会在模板渲染时输出. 用这种语法的注 ...
- [python+opencv] ROI(Range Of Interest)与泛洪填充
python+opencv3.3视频教学 基础入门笔记(贾志刚老师) https://www.bilibili.com/video/av24998616/?p=8 ROI(Range Of Inter ...
- IO流(6)获取功能
获取功能: * public String getAbsolutePath():获取绝对路径 * public String getPath():获取相对路径 * public String getN ...