作家
登录

干货满满,SQL优化经验总结34条~

作者: 来源: 2017-11-10 09:13:36 阅读 我要评论

(1) 选择最有效力的表名次序 (只在基于规矩的优化器中有效):

(18) 用 EXISTS 调换 DISTINCT:

ORACLE 的解析器按照大年夜右到左的次序处理 FROM 子句中的表名,FROM 子句中写在最后的表 (基本表 driving table) 将被最先处理,在 FROM 子句中包含多个表的情况下,你必须选择记录条数起码的表作为基本表。如不雅有 3 个以上的表连接萌芽, 那就须要选择交叉表 (intersection table) 作为基本表,交叉表是指那个被其他表所引用的表。

(2) WHERE 子句中的连接次序.:

(4) 削减拜访数据库的次数:

ORACLE 采取自下而上的次序解析 WHERE 子句, 根据这个道理,表之间的连接必须写在其他 WHERE 前提之前, 那些可以过滤掉落最大年夜数量记录的前提必须写在 WHERE 子句的末尾。

(3) SELECT 子句中避免应用 ‘ * ‘:

ORACLE 在解析的过程中,会将’*’ 依次转换成所有的列名, 这个工作是经由过程萌芽数据字典完成的, 这意味着将消费更多的时光。

ORACLE 在内部履行了很多工作: 解析 SQL 语句,估算索引的应用率,绑定变量, 读数据块等。

(5) 在 SQL*Plus , SQL*Forms 和 Pro*C 中从新设置 ARRAYSIZE 参数, 可以增长每次数据库拜访的检索数据量 , 建议值为 200。

(6) 应用 DECODE 函数来削减处理时光:

应用 DECODE 函数可以避免反复扫描雷同记录或反复连接雷同的表。

(7) 整百口单,无接洽关系的数据库拜访:

如不雅你有几个简单的数据库萌芽语句,你可以把它们整合到一个萌芽中 (即使它们之间没有关系)。

(8) 删除反复记录:

最高效的删除反复记录办法 (因为应用了 ROWID) 例子:

DELETE FROM EMP E WHERE E.ROWID > (SELECT MIN(X.ROWID)

(9) 用 TRUNCATE 替代 DELETE:

SELECT … FROM EMP WHERE EMPNO = ‘123’

当删除表中的记录时,在平日情况下,回滚段 (rollback segments) 用来存放可以被恢复的信息。如不雅你没有 COMMIT 事务, ORACLE 会将数据恢复到删除之前的状况 (精确地说是恢复到履行删除敕令之前的状况) 而当应用 TRUNCATE 时, 回滚段不再存放任何可被恢复的信息。 当敕令运行后, 数据不克不及被恢复,是以很少的资本被调用,履行时光也会很短。 (译者按:TRUNCATE 只在删除全表实用,TRUNCATE 是 DDL 不是 DML)

(10) 尽量多应用 COMMIT:

只要有可能, 在法度榜样中尽量多应用 COMMIT,如许法度榜样的机能获得进步,需求也会因为 COMMIT 所释放的资本而削减:

COMMIT 所释放的资本:

a. 回滚段上用于恢复数据的信息

b. 被法度榜样语句获得的锁

c. redo log buffer 中的空间

(11) 用 Where 子句调换 HAVING 子句:

避免应用 HAVING 子句,HAVING 只会在检索出所有记录之后才对结不雅集进行过滤。这个处理须要排序, 总计等操作。如不雅能经由过程 WHERE 子句限制记录的数量, 那就能削减这方面的开销。 (非 oracle 中)on、where、having 这三个都可以加前提的子句中,on 是最先履行,where 次之,having 最后,因为 on 是先把不相符前提的记录过滤后才进行统计,它就可以削减中心运算要处理的数据,按理说应当速度是最快的,where 也应当比 having 快点的,因为它过滤数据后才进行 sum,在两个表联接时才用 on 的,所以在一个表的时刻,就剩下 where 跟 having 比较了。在这单表萌芽统计的情况下,如不雅要过滤的前提没有涉及到要计举动当作段,那它们的结不雅是一样的,只是 where 可以应用 rushmore 技巧,而 having 就不克不及,在速度上后者要慢如不雅要涉及到计算的字段,就表示在没计算之前,这个字段的值是不肯定的,根据上篇写的工作流程,where 的感化时光是在计算之前就完成的,而 having 就是在计算后才起感化的,所以在这种情况下,两者的结不雅会不合。在多表联接萌芽时,on 比 where 更夙兴感化。体系起首根据各个表之间的联接前提,把多个表合成一个临时表后,再由 where 进行过滤,然后再计算,计算完后再由 having 进行过滤。由此可见,要想过滤前提起到精确的感化,起重要明白这个前提应当在什么时刻起感化,然后再决定放在那边。

(12) 削减对表的萌芽:

在含有子萌芽的 SQL 语句中, 要特别留意削减对表的萌芽。例子:

SELECT TAB_NAME FROM TABLES WHERE (TAB_NAME,DB_VER) = ( SELECT

(13) 经由过程内部函数进步 SQL 效力.:

复杂的 SQL 往往就义了履行效力. 可以或许控制膳绫擎的应用函数解决问题的办法在实际工作中是异常有意义的

(14) 应用表的别号 (Alias):

当在 SQL 语句中连接多个表时,请应用表的别号并把别号前缀于每个 Column 上。如许一来, 就可以削减解析的时光并削减那些由 Column 歧义引起的语法缺点。

(15) 用 EXISTS 替代 IN、用 NOT EXISTS 替代 NOT IN:

在很多基于基本表的萌芽中,为了知足一个前提,往往须要对另一个表进行联接。在这种情况下,应用 EXISTS(或 NOT EXISTS) 平日将进步萌芽的效力。在子萌芽中,NOT IN 子句将履行一个内部的排序和归并。 无论在哪种情况下, NOT IN 都是最低效的 (因为它对子萌芽中的表履行了一个全表遍历)。 为了避免应用 NOT IN , 我们可以把它改写成外连接 (Outer Joins) 或 NOT EXISTS。

例子:

荣幸的是, 类型转换没有产生在索引列上, 索引的用处没有被改变.

干货满满,SQL优化经验总结34条

(高效)SELECT * FROM EMP (基本表) WHERE EMPNO > 0 AND EXISTS (SELECT ‘X'FROM DEPT WHERE DEPT.DEPTNO = EMP.DEPTNO AND LOC = ‘MELB')


  推荐阅读

  润乾软件和永洪科技签订战略合作协议

Tech Neo技巧沙龙 | 11月25号,九州云/ZStack与您一路商量云时代收集界线治理实践【51CTO.com稿件】2017年11月8日,润乾软件和永洪科技举办了计谋合作签约典礼。出席签约典礼的有润乾软件开创人蒋步星、>>>详细阅读


本文标题:干货满满,SQL优化经验总结34条~

地址:http://www.17bianji.com/lsqh/38694.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)