近期SQL优化总结

近期做SQL优化,发现了一些问题,感觉还是有必要拉出来说说的,不涉及多么高深的技术问题、或者与技术没多大关系,大多都是思想认识的问题,多想想多看看应该都会解决的。

当然这里有个成本和效益的问题,某些年前我向某些人提到类似的问题,但人家以时间和成本为由给挡了回来,这个我也能理解,毕竟做项目是要赚钱的,亏本的买卖没人做,一个项目就那么点钱,也是没办法的。

1. 绑定变量的问题。

主要是很多语句没有绑定变量,主要是写在Java里面的语句,主要是由框架引起的,不同框架有不同的写法,说到底是对框架的不熟悉,多了解下应该都能避免的。

2. 隐含转换的问题。

多发生于date、number、char/varchar2类型及其子类型,一是设计不合理,二是思想认识的问题了,这个是老生常谈的话题了。

3. 减少表的访问次数问题。

主要是某些语句中重复对某些表的多次使用,可考虑使用with语句、decode、case等来进行替换。

4. 中间结果集大小的问题。

就是,是先join连接,后过滤条件呢?还是先过滤条件,后join连接的问题。

5. 列上做运算的问题。

特别是索引列,如,非空、大小写的处理。这块应该在应用层处理好,然后再到数据库进行运算,而不是让数据库来处理这些。

6. order by、group by 、distinct、union等关键字要特别关注。

在使用前先想一想,到底要不要使用,怎么用才合理,是否有别的替代方案,不要三七二十八一上来就用。

7. 要善于使用Oracle的函数。

如:常用的decode、case、分析函数等,逻辑清晰、功能强大,比自己绞尽脑汁写一堆废话强多了。

8. 聚合操作取了不必要的列,列上又做了操作(或做了排序)。

如:select count(1) from (select t.empno,t.ename,... from scott.emp e ...

where ...  order by 1 ...);

需要这个吗?

9. 行争用的问题。

频繁地对某些表做DML操作(增删改),会引起严重的行争用。根源一是表设计不合理,二是相关的语句执行效率低下。要想降低,一是在设计上分为中间临时表、当前表、历史表来分散这些DML操作,二是提高语句的质量。

10. 业务逻辑上的处理,复杂了,不讲了。

综上所述,搞SQL优化思想意识很重要,当然钱也很重要(项目管理的四个大要素,时间、成本、质量、范围,那个和钱没有关系),所以在时间和成本不是问题的前提下,我觉得还是可以看看的,如果时间和成本是问题了,那就麻烦了。

时间: 2024-08-24 09:59:04

近期SQL优化总结的相关文章

sql优化

1.all: 全表扫描,遍历全表找到匹配的行 index:索引全扫描,遍历整个索引来查询匹配的行 range:索引范围扫描,常见于<,>,>=,between等操作符 ref: 使用非唯一索引扫描或唯一索引的前缀扫描,返回匹配某个单独值的记录行 eq_ref:类似ref,区别就是使用的索引是唯一索引,对于每个索引键值,表中只有一条记录匹配.简单来说,就是多表连接中使用primary key或者unique index 作为关联条件 const/system:单表中最多有一个匹配行,查询起

sql优化(oracle)- 第三部分 &#160;sql优化总结

第三部分  sql优化总结        1. 优化一般原则        2. 具体注意事项 1. SQL优化一般性原则 1)目标:减少服务器资源消耗(主要是磁盘IO) 2)设计: 1. 尽量依赖oracle优化器 2. 合适的索引(数据重复量大的列不要简历二叉树索引,可以使用位图索引: 对应数据操作频繁的表,索引需要定期重建,减少失效的索引和碎片) 3)编码: 1. 利用索引 2. 合理利用临时表 3. 避免写过于复杂的sql: 4. 尽量减小事务的粒度 2. 具体注意事项 1)查询时尽量使

SQL优化技巧

我们开发的大部分软件,其基本业务流程都是:采集数据→将数据存储到数据库中→根据业务需求查询相应数据→对数据进行处理→传给前台展示.对整个流程进行分析,可以发现软件大部分的操作时间消耗都花在了数据库相关的IO操作上.所以对我们的SQL语句进行优化,可以提高软件的响应性能,带来更好的用户体验. 在开始介绍SQL优化技巧之前,先推介一款数据库管理神器Navicat,官网:https://www.navicat.com.cn/whatisnavicat Navicat是一套快速.可靠和全面的数据库管理工

数据库SQL优化大总结之百万级数据库优化方案

网上关于SQL优化的教程很多,但是比较杂乱.近日有空整理了一下,写出来跟大家分享一下,其中有错误和不足的地方,还请大家纠正补充. 这篇文章我花费了大量的时间查找资料.修改.排版,希望大家阅读之后,感觉好的话推荐给更多的人,让更多的人看到.纠正以及补充. 1.对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id f

基于案例SQL优化第九课作业分享

默认统计信息收集: 1. 11g默认启动了统计信息收集的任务,默认运行时间是周一到周五晚上10点和周6,周天的早上6点 2. 你也可以关闭自动统计新收集任务,选择手工收集的方式,但是一般不建议这样操作. 动态统计信息: 1. 统计信息默认情况下是每天晚上10点半后收集,如果新建对象还没来得级收集统计信息,就采用动态采样的方式. 2. 具体在set autotrace 跟踪的执行计划中,可以看到类似:- dynamic sampling used for this statement (level

Sql优化和体系结构

01.SQL优化与体系结构 本章目标: 1.了解sql优化基本技巧 2.掌握使用索引提高查询效率 3.了解对表进行分区操作 4.了解常见数据库对象 1.sql优化技巧 1)一般优化技巧: 不要用*代替所有列名 删除所有数据用truncate代替delete 用not exists 代替 not in 用exists 代替 in 用exists代替distinct 注:后三点在11g之前有用,11g之后本身进行了优化 第5条的实例如下:查询出出现在教师表里的不同的部门编号 select disti

SQL优化经验

SQL 优化经验总结34条 我们要做到不但会写SQL,还要做到写出性能优良的SQL,以下为笔者学习.摘录.并汇总部分资料与大家分享! (1) 选择最有效率的表名顺序(只在基于规则的优化器中有效): ORACLE 的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表.如果有3个以上的表连接查询, 那就需要选择交叉表(intersection tabl

SQL的别名和SQL的执行顺序和SQL优化

SQL的别名 1.不可以在where子句中使用列名的别名,即select name t from emp where t>2999;是不允许的 2.使用别名的好处: 提高SQL的易读性 提高SQL的解析执行效率 语法检查 语义检查 共享池检查 生成执行树 执行 3.SQL的硬解析和软解析? SQL的执行顺序 1.from语句--where语句--group by语句--having语句--select语句--order by语句 rownum的使用 select * from emp rownu

MySQL 数据库性能优化之SQL优化

前言 有人反馈之前几篇文章过于理论缺少实际操作细节,这篇文章就多一些可操作性的内容吧. 注:这篇文章是以 MySQL 为背景,很多内容同时适用于其他关系型数据库,需要有一些索引知识为基础. 优化目标 1.减少 IO 次数 IO永远是数据库最容易瓶颈的地方,这是由数据库的职责所决定的,大部分数据库操作中超过90%的时间都是 IO 操作所占用的,减少 IO 次数是 SQL 优化中需要第一优先考虑,当然,也是收效最明显的优化手段. 2.降低 CPU 计算 除了 IO 瓶颈之外,SQL优化中需要考虑的就