(16) 辨认’低效履行’的 SQL 语句:
固然今朝各类关于 SQL 优化的图形化对象层出不穷,然则写出本身的 SQL 对象来解决问题始终是一个最好的办法:
SELECT EXECUTIONS , DISK_READS, BUFFER_GETS,
(17) 用索引进步效力:
索引是表的一个概念部分,用来进步检索数据的效力,ORACLE 应用了一个复杂的自均衡 B-tree 构造。平日, 经由过程索引萌芽数据比全表扫描要快. 当 ORACLE 找出履行萌芽和 Update 语句的最佳路径时,ORACLE 优化器将应用索引. 同样在联络多个表时应用索引也可以进步效力。 另一个应用索引的好处是, 它供给了主键 (primary key) 的独一性验证。那些 LONG 或 LONG RAW 数据类型,你可以索引几乎所有的列。 平日, 在大年夜型表中应用索引特别有效。当然, 你也会发明, 在扫描小表时, 应用索引同样能进步效力。固然应用索引能获得萌芽效力的进步, 然则我们也必须留意到它的价值。索引须要空间来存储,也须要按期保护, 每当有记录在表中增减或索引列被修改时,索引本身也会被修改。这意味着每笔记录的 INSERT, DELETE, UPDATE 将为此多付出 4 、5 次的磁盘 I/O 。 因为索引须要额外的存储空间和处理, 那些不须要的索引反而会使萌芽反竽暌功时光变慢。按期的重构索引是有须要的:
ALTER INDEX REBUILD
d. ORACLE 为治理上述 3 种资本中的内部花费
当提交一个包含一对多表信息 (比如部分表和雇员表) 的萌芽时,避免在 SELECT 子句中应用 DISTINCT。 一般可以推敲用 EXIST 调换, EXISTS 使萌芽更为敏捷,因为 RDBMS 核心模块将在子萌芽的前提一旦知足后,急速返回结不雅. 例子:
(低效):
(19) sql 语句用大年夜写的;因为 oracle 老是先解析 sql 语句,把小写的字母转换成大年夜写的再履行
(20) 在 java 代码中尽量罕用连接符 “+” 连接字符串!
(21) 避免在索引列上应用 NOT 平日
我们要避免在索引列上应用 NOT, NOT 会产生在和在索引列上应用函数雷同的影响。当 ORACLE” 碰到”NOT, 他就会停止应用索引转而履行全表扫描。
(22) 避免在索引列上应用计算.
WHERE 子句中,如不雅索引列是函数的一部分,优化器将不应用索引而应用全表扫描。
举例:
(23) 用 >= 替代 >
高效:
(24) 用 UNION 调换 OR (实用于索引列)
平日情况下, 用 UNION 调换 WHERE 子句中的 OR 将会起到较好的效不雅。对索引列应用 OR 将造成全表扫描。留意, 以上规矩只针对多个索引列有效. 如不雅有 column 没有被索引,萌芽效力可能会因为你没有选择 OR 而降低。 鄙人面的例子中,LOC_ID 和 REGION 上都建有索引。
高效:
如不雅你保持要用 OR,那就须要返回记录起码的索引列写在最前面。
(25) 用 IN 来调换 OR
Tech Neo技巧沙龙 | 11月25号,九州云/ZStack与您一路商量云时代收集界线治理实践
这是一条简单易记的规矩,然则实际的履行效不雅还须考验,在 ORACLE8i 下,两者的履行路径似乎是雷同的。
低效:
避免在索引中应用任何可认为空的列,ORACLE 将无法应用该索引.对于单列索引,如不雅列包含空值,索引中将不存在此记录. 对于复合索引,如不雅每个列都为空,索引中同样不存在此记录。如不雅至少有一个列不为空,则记录存在于索引中.举例: 如不雅独一性索引建立在表的 A 列和 B 列上, 并且表中存在一笔记录的 A,B 值为 (123,null) ,ORACLE 将不接收下一条具有雷同 A,B 值(123,null)的记录 (插入)。 然而如不雅所有的索引列都为空,ORACLE 将认为全部键值为空而空不等于空。是以你可以插入 1000 条具有雷同键值的记录,当然它们都是空! 因为空值不存在于索引列中, 所以 WHERE 子句中对索引列进行空值比较将使 ORACLE 停用该索引。
低效:(索引掉效)
(27) 老是应用索引的第一个列
如不雅索引是建立在多个列上, 只有在它的第一个列 (leading column) 被 where 子句引用时,优化器才会选择应用该索引 。这也是一条简单而重要的规矩,当局引用索引的第二个列时,优化器应用了全表扫描而忽视了索引。
28) 用 UNION-ALL 调换 UNION (如不雅有可能的话)
当 SQL 语句须要 UNION 两个萌芽结不雅集应时,这两个结不雅聚聚会会议以 UNION-ALL 的方法被归并,然后在输出最终结不雅进步行排序。 如不雅用 UNION ALL 替代 UNION,如许排序就不是须要了。 效力就会是以获得进步。须要留意的是,UNION ALL 将反复输出两个结不雅集合中雷同记录。 是以各位照样要大年夜营业需求分析应用 UNION ALL 的可行性。UNION 将对结不雅集合排序,这个操作会应用到 SORT_AREA_SIZE 这块内存。 对于这块内存的优化也是相当重要的。 下面的 SQL 可以用来萌芽排序的消费量
低效:
低效:
(29) 用 WHERE 替代 ORDER BY
ORDER BY 子句只在两种严格的前提下应用索引。
ORDER BY 中所有的列必须包含在雷同的索引中并保持在索引中的分列次序。
ORDER BY 中所有的列必须定义为非空。
WHERE 子句应用的索引和 ORDER BY 子句中所应用的索引不克不及并列。
例如:
表 DEPT 包含以下列:
DEPT_CODE PK NOT NULL
带有 DISTINCT,UNION,MINUS,INTERSECT,ORDER BY 的 SQL 语句会启动 SQL 引擎。
DEPT_DESC NOT NULL
DEPT_TYPE NULL
低效: (索引不被应用)
(30) 避免改变索引列的类型
当比较不合数据类型的数据时, ORACLE 主动对列进内行单的类型转换.
假设 EMPNO 是一个数值类型的索引列.
实际上, 经由 ORACLE 类型转换, 语句转化为:
(26) 避免在索引列上应用 IS NULL 和 IS NOT NULL
SELECT … FROM EMP WHERE EMPNO = TO_NUMBER(‘123’)
推荐阅读
Tech Neo技巧沙龙 | 11月25号,九州云/ZStack与您一路商量云时代收集界线治理实践【51CTO.com稿件】2017年11月8日,润乾软件和永洪科技举办了计谋合作签约典礼。出席签约典礼的有润乾软件开创人蒋步星、>>>详细阅读
本文标题:干货满满,SQL优化经验总结34条~
地址:http://www.17bianji.com/lsqh/38694.html
1/2 1