Oracle_SQL规范与优化

合集下载

Oracle数据库设计规范建议

Oracle数据库设计规范建议

Oracle数据库1 数据对象的命名规范1.1 通用规范1.1.1 使用英文:要用简单明了的英文单词,不要用拼音,特别是拼音缩写。

主要目的很明确,让人容易明白这个对象是做什么用的;1.1.2 一律大写,特别是表名:有些数据库,表的命名乃至其他数据对象的命名是大小写敏感的,为了避免不必要的麻烦,并且尊重通常的习惯,最好一律用大写;1.2 数据库对象命名规范1.2.1 表的命名1.2.1.1 表名的前缀:前缀_表名_T。

为表的名称增加一个或者多个前缀,前缀名不要太长,可以用缩写,最好用下划线与后面的单词分开;其目的有这样几个:1.2.1.1.1 为了不与其他项目或者其他系统、子系统的表重名;1.2.1.1.2 表示某种从属关系,比如表明是属于某个子系统、某个模块或者某个项目等等。

表示这种从属关系的一个主要目的是,从表名能够大概知道如何去找相关的人员。

比如以子系统为前缀的,当看到这个表的时候,就知道有问题可以去找该子系统的开发和使用人员;1.2.2 视图命名:相关表名_V(或者根据需要另取名字);1.2.3 程序包命名:程序包名_PKG(用英文表达程序包意义);1.2.4 存储过程命名:存储过程名_PRO(用英文表达存储过程意义);1.2.5 函数命名:函数名称_FUN(用英文表达函数作用);1.2.6 触发器命名:触发器名称_TRI(用英文表达触发器作用);1.2.7 索引命名:表名_字段名_IDX(如果存在多字段索引,取每字段前三个字符加下划线组合,如在 custom, cutting, curtail 上建立联合索引,命名为表名_cus_cut_cur_IDX,如果前三个截取字符相同,就从字段名称中不同的字符开始取三个字符加下划线组合,如在 custid, custom,custname上建立联合索引,就命名为表_tid_tom_tna_IDX;1.2.8 唯一索引命名:表名_字段名_UNI(如果存在多字段唯一索引,取每字段前三个字符加下划线组合,如在 custom, cutting, curtail上建立唯一索引,命名为表名_ cus_cut_cur_UNI,如果前三个截取字符相同,就从字段名称中不同的字符开始取三个字符加下划线组合,如:在 custid, custom,custname上建立唯一索引,命名:表_tid_tom_tna_UNI;1.2.9 主键命名:表名_字段名_PK(如果存在多字段主键,取每字段前三个字符加下划线组合,如在 custom, cutting, curtail上建立主键,命名为表名_cus_cut_cur_PK,如果前三个截取字符相同,就从字段名称中不同的字符开始取三个字符加下划线组合,如在 custid, custom,custname上建立主键,命名:表_tid_tom_tna_PK;1.2.10 外键命名:表名_主表名_字段名_FK;1.2.11 Sequence命名:表名_列名_SEQ(或者根据需要另取名字);1.2.12 Synonym命名:与对应的数据库对象同名;1.2.12 JAVA命名:遵守公司相应的JAVA命名规范;2 SQL的设计和使用2.1 Sql 书写规范2.1.1 尽量不要写复杂的SQL:过于复杂的S QL可以用存储过程或函数来代替,效率更高;甚至如果能保证不造成瓶颈的话,把条SQL拆成多条也是可以的。

Oracle优化面试题

Oracle优化面试题

Oracle优化⾯试题Oracle SQL性能优化(1)选择最有效率的表名顺序(只在基于规则的优化器中有效):ORACLE的解析器按照从右到左的顺序处理FROM⼦句中的表名,FROM⼦句中写在最后的表(基础表 driving table)将被最先处理,在FROM⼦句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。

如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引⽤的表.(2)WHERE⼦句中的连接顺序.:ORACLE采⽤⾃下⽽上的顺序解析WHERE⼦句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最⼤数量记录的条件必须写在WHERE⼦句的末尾.(3)SELECT⼦句中避免使⽤ ‘ * ‘:ORACLE在解析的过程中, 会将'*' 依次转换成所有的列名, 这个⼯作是通过查询数据字典完成的, 这意味着将耗费更多的时间(4)减少访问数据库的次数: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)FROM EMP X WHERE X.EMP_NO = E.EMP_NO);(9)⽤TRUNCATE替代DELETE:当删除表中的记录时,在通常情况下, 回滚段(rollback segments ) ⽤来存放可以被恢复的信息. 如果你没有COMMIT事务,ORACLE会将数据恢复到删除之前的状态(准确地说是恢复到执⾏删除命令之前的状况) ⽽当运⽤TRUNCATE时, 回滚段不再存放任何可被恢复的信息.当命令运⾏后,数据不能被恢复.因此很少的资源被调⽤,执⾏时间也会很短. (译者按: TRUNCATE只在删除全表适⽤,TRUNCATE是DDL不是DML)(10)尽量多使⽤COMMIT:只要有可能,在程序中尽量多使⽤COMMIT, 这样程序的性能得到提⾼,需求也会因为COMMIT所释放的资源⽽减少:COMMIT所释放的资源:a. 回滚段上⽤于恢复数据的信息.b. 被程序语句获得的锁c. redo log buffer 中的空间d. ORACLE为管理上述3种资源中的内部花费(11)⽤Where⼦句替换HAVING⼦句:避免使⽤HAVING⼦句, HAVING 只会在检索出所有记录之后才对结果集进⾏过滤. 这个处理需要排序,总计等操作. 如果能通过WHERE⼦句限制记录的数⽬,那就能减少这⽅⾯的开销. (⾮oracle中)on、where、having这三个都可以加条件的⼦句中,on是最先执⾏,where次之,having最后,因为on是先把不符合条件的记录过滤后才进⾏统计,它就可以减少中间运算要处理的数据,按理说应该速度是最快的,where也应该⽐having快点的,因为它过滤数据后才进⾏sum,在两个表联接时才⽤on的,所以在⼀个表的时候,就剩下where跟having⽐较了。

oracle数据库性能调优

oracle数据库性能调优

oracle数据库性能调优⼀:注意WHERE⼦句中的连接顺序:ORACLE采⽤⾃下⽽上的顺序解析WHERE⼦句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最⼤数量记录的条件必须写在WHERE⼦句的末尾.尤其是“主键ID=?”这样的条件。

⼆: SELECT⼦句中避免使⽤ ‘ * ‘:ORACLE在解析的过程中, 会将'*' 依次转换成所有的列名, 这个⼯作是通过查询数据字典完成的, 这意味着将耗费更多的时间。

简单地讲,语句执⾏的时间越短越好(尤其对于系统的终端⽤户来说)。

⽽对于查询语句,由于全表扫描读取的数据多,尤其是对于⼤型表不仅查询速度慢,⽽且对磁盘IO造成⼤的压⼒,通常都要避免,⽽避免的⽅式通常是使⽤索引Index。

三:使⽤索引的优势与代价。

优势:1)索引是表的⼀个概念部分,⽤来提⾼检索数据的效率,ORACLE使⽤了⼀个复杂的⾃平衡B-tree结构. 通常,通过索引查询数据⽐全表扫描要快. 当ORACLE找出执⾏查询和Update语句的最佳路径时, ORACLE优化器将使⽤索引. 同样在联结多个表时使⽤索引也可以提⾼效率. 2)另⼀个使⽤索引的好处是,它提供了主键(primary key)的唯⼀性验证.。

那些LONG或LONG RAW数据类型, 你可以索引⼏乎所有的列. 通常, 在⼤型表中使⽤索引特别有效. 当然,你也会发现, 在扫描⼩表时,使⽤索引同样能提⾼效率.代价:虽然使⽤索引能得到查询效率的提⾼,但是我们也必须注意到它的代价. 索引需要空间来存储,也需要定期维护, 每当有记录在表中增减或索引列被修改时, 索引本⾝也会被修改. 这意味着每条记录的INSERT , DELETE , UPDATE将为此多付出4 , 5 次的磁盘I/O . 因为索引需要额外的存储空间和处理,那些不必要的索引反⽽会使查询反应时间变慢.。

⽽且表越⼤,影响越严重。

使⽤索引需要注意的地⽅:1、避免在索引列上使⽤NOT , 我们要避免在索引列上使⽤NOT, NOT会产⽣在和在索引列上使⽤函数相同的影响. 当ORACLE”遇到”NOT,他就会停⽌使⽤索引转⽽执⾏全表扫描.2、避免在索引列上使⽤计算.WHERE⼦句中,如果索引列是函数的⼀部分.优化器将不使⽤索引⽽使⽤全表扫描.举例:代码如下:低效:SELECT … FROM DEPT WHERE SAL * 12 > 25000;⾼效:SELECT … FROM DEPT WHERE SAL > 25000/12;3、避免在索引列上使⽤IS NULL和IS NOT NULL避免在索引中使⽤任何可以为空的列,ORACLE性能上将⽆法使⽤该索引.对于单列索引,如果列包含空值,索引中将不存在此记录. 对于复合索引,如果每个列都为空,索引中同样不存在此记录. 如果⾄少有⼀个列不为空,则记录存在于索引中.举例: 如果唯⼀性索引建⽴在表的A列和B列上, 并且表中存在⼀条记录的A,B值为(123,null) , ORACLE将不接受下⼀条具有相同A,B值(123,null)的记录(插⼊). 然⽽如果所有的索引列都为空,ORACLE将认为整个键值为空⽽空不等于空. 因此你可以插⼊1000 条具有相同键值的记录,当然它们都是空! 因为空值不存在于索引列中,所以WHERE⼦句中对索引列进⾏空值⽐较将使ORACLE停⽤该索引.代码如下:低效:(索引失效) SELECT … FROM DEPARTMENT WHERE DEPT_CODE IS NOT NULL;⾼效:(索引有效) SELECT … FROM DEPARTMENT WHERE DEPT_CODE >=0;4、注意通配符%的影响使⽤通配符的情况下Oracle可能会停⽤该索引。

Oracle SQL语句优化技术分析

Oracle SQL语句优化技术分析
4 结 论
O a e S L 句的性 能问题 常常是 由于 rl Q 语 c 在索引设计和查询设计方面存在各种缺陷引起 的。 Q 优化的实质就是在结果正确的前提下 , SL 充份利用索引 , 减少表扫描的 I / O次数 , 尽量避 免表搜索的发生 。 其实 S L Q 的性能优 化是一个 复杂的过程 ,以上这些只是在应用层次 的一种 体现 , 深入研究还会涉及数据库层 的资源配置 、 网络层的流量控制 以及操作系统层 的总体设计 如 等等方面 , 已经超 出本文所要讨论 的范 围, 这些 S EC EL T FROM US ER LOG WHER 因此不在本文赘述 了。 E 总之 Oal S L语句 的 r e Q c USE N R AME ei ( L C U E _ A 不断总结 , 才 xs t S E T S R N ME 优化需要我们在生产 中不断学习 , E FROM T F W HE TY C D =05 ' S AF E R CI 能更为得心应手 的应用到工作中去。 O E ' 1 4 3 O N操作符 . N TI 2 此操作是 强列不推荐使用 的 , 因为它不能
的 ,因为索引是不索引空值的。使用 I N L SU 或 I O U ,r l会停止使用 索引而执 SN TN L Oa e c 行 全表扫描。 以考虑在设计表时 , 引列设 可 对索 置为 N T N L 。这样就可以用其他操作来取 O U L 代 判断 N L 的操作。 UL
_
b .同一功能 同一性能 不同写法 S QL的影 响。 如一个 S L在 A程序员写的为 slc S Q eetU— e a ,s d f m s fB程序员写 的为 s—  ̄nme e r t u o a e le s r n meu e i f m zj s ( e t u e a . s r d r h .a 带表所有 o st f 者的前缀 )c程序员写的为 Sl tu rn n, e c s_s e e e z u ser i f m Z J . A F ( 写表名 )D程序 d r HS T F 大 o S 员 写 的 为 Slc srnme sri f m e et e_a , e_d r u u o z SS A F 中间多 了空格 )以上 四个 S L在 Ⅲ . F( T Q OAL R C E分析整理之后产生的结果及执行的时

oracle sql 优化技巧

oracle sql 优化技巧

oracle sql 优化技巧(实用版3篇)目录(篇1)1.Oracle SQL 简介2.优化技巧2.1 减少访问数据库次数2.2 选择最有效率的表名顺序2.3 避免使用 SELECT2.4 利用 DECODE 函数2.5 设置 ARRAYSIZE 参数2.6 使用 TRUNCATE 替代 DELETE2.7 多使用 COMMIT 命令2.8 合理使用索引正文(篇1)Oracle SQL 是一款广泛应用于各类大、中、小微机环境的高效、可靠的关系数据库管理系统。

为了提高 Oracle SQL 的性能,本文将为您介绍一些优化技巧。

首先,减少访问数据库的次数是最基本的优化方法。

Oracle 在内部执行了许多工作,如解析 SQL 语句、估算索引的利用率、读数据块等,这些都会大量耗费 Oracle 数据库的运行。

因此,尽量减少访问数据库的次数,可以有效提高系统性能。

其次,选择最有效率的表名顺序也可以明显提升 Oracle 的性能。

Oracle 解析器是按照从右到左的顺序处理 FROM 子句中的表名,因此,合理安排表名顺序,可以减少解析时间,提高查询效率。

在执行 SELECT 子句时,应尽量避免使用,因为 Oracle 在解析的过程中,会将依次转换成列名,这是通过查询数据字典完成的,耗费时间较长。

DECODE 函数也是一个很好的优化工具,它可以避免重复扫描相同记录,或者重复连接相同的表,提高查询效率。

在 SQLPlus 和 SQLForms 以及 ProC 中,可以重新设置 ARRAYSIZE 参数。

该参数可以明显增加每次数据库访问时的检索数据量,从而提高系统性能。

建议将该参数设置为 200。

当需要删除数据时,尽量使用 TRUNCATE 语句替代 DELETE 语句。

执行 TRUNCATE 命令时,回滚段不会存放任何可被恢复的信息,所有数据不能被恢复。

因此,TRUNCATE 命令执行时间短,且资源消耗少。

在使用 Oracle 时,尽量多使用 COMMIT 命令。

Oracle培训之:sql优化--

Oracle培训之:sql优化--

13
在SQLPLUS 配置AUTOTRACE
AUTOTRACE 参数
SET AUTOTRACE OFF SET AUTOTRACE ON EXPLAIN SET AUTOTRACE ON STATISTICS SET AUTOTRACE ON SET AUTOTRACE TRACEONLY


不能获得AUTOTRACE报告. 这是默认的. 仅仅显示优化器执行计划的AUTOTRACE 报告 仅仅显示SQL语句执行的统计结果的 AUTOTRACE报告 包括上面两项内容的AUTOTRACE报告 与SET AUTOTRACE ON类似,所有的统计 和数据都在,但不可以打印
23
第五章:SQL重编译问题
SQL共享原理 SQL共享的三个条件 PROC程序的SQL共享 PROC程序中以下类型的语句不需进行变量 绑定 • PROC程序的CLIENT参数 • 存储过程的SQL共享 • SQL共享的数据库参数的利弊
24
• • • •
SQL共享原理
• ORACLE将执行过的SQL语句存放在内存 的共享池(shared buffer pool)中,可以被所 有的数据库用户共享 • 当你执行一个SQL语句(有时被称为一个游 标)时,如果它和之前的执行过的语句完全相 同, ORACLE就能很快获得已经被解析的语 句以及最好的 执行路径. 这个功能大大地提 高了SQL的执行性能并节省了内存的使用
查找原因的步骤(四)
• 是否为表和相关的索引搜集足够的统计数 据。对数据经常有增、删、改的表最好定 期对表和索引进行分析,可用SQL语句 “analyze table xxxx compute statistics for all indexes;”。ORACLE掌握了充分反映实 际的统计数据,才有可能做出正确的选择 • 索引列的选择性不高 (字段值重复率高)

Oracle数据库优化原则和方法

一 一
当表 的记录数较大时 , 必然会影响查询速度。 这时 , 通过索引 查 询数据 比全表扫描效率要 高得 多。在写S L Q 语句时 , 应遵循 以 下原则 :避免在索引列上 使用N TI 、 U LI O U L O I N L 、 N TN L 、 NS S LK 等操作符或者 函数计算( IE 如转换字段类型 )否D O al , ] rc 数据 e 库会停止使用索引转而执行全表扫描。实际应用 中 , 有时必须要 在列 中应用函数等条件 ,则可以通过强制索引提示来利用索引。 当然 , 不一定用索引就一定是最优 的, 比如一个表只有两行数据 , 次I 就可 以完成全表 的检索 , / O 而此时用索引则需要两次I 这 / O, 时对这个 表做全表扫描是最好的。
hr d t ,.o ie aeb c mm r m mp ,o u F o e eb n s b w e eee a = .n me h r .n me b e a

调 整操 作 系统
ห้องสมุดไป่ตู้
Oal数据库服务器很 大程度上依 赖于运行 服务器 的操作 rce 系统 , 应尽 可能使O al  ̄ rc n 务器使用资源最大化 , e 特别是在Ci t ln e/ Sre,. evr_  ̄间的I 操作 。在数据库中建 表时, / O 对于一些简单且有特 殊要求 的数据 , 上适 当的完整性约束条件 ; 加 对一些较复杂 的处 理规则 , 可以利用数据 库触 发器来实现 , 数据库触发器 由数据本 身实现。另外 , 通过在O al 据库 中创建存储过程和函数 , rce 数 把复 杂 的s L Q 语句存储在服务器端 , 使应用程序 只需要简单地调用存 储过程和函数 , 网络上只需传输调用 的存储过程或 函数 的名字 在 和输出结果 。 这样都 可以有效地减少在客户端和服务器端之间传 递S L Q 语句的可能性 , 减轻网络I 负担。 / O 通 过 长 期 维 护 经 验 总 结 :0 8 %的性 能 问题 都 是 由不 良的S L Q 语句引起的, 所以调剂 和建立最佳的s L Q 语句对于业务系统的可 扩展性 和响应时间来说都显得尤为重要。影响s L Q 语句执行速度 的主要因素有 : 驱动表 的选择是否恰 当、 查询时是否用到恰当的 索引 、 间的连接顺序及条件顺序是否恰 当等 。对于一段准备 表之 执行 的s L Q 语句 , 首先分析其执行计划 。现在有很多 可视化工具 , 比如P Q 或者T A 等都提供 了非常方便的手段来获取 s L L OD Q 语 句的执行计划 。 通过分析执行计划 , 结合涉及到的表 的数据量 , 我 们 可以估算 或者测试该语句 的执行效率 ,分析表WH R 条件中 EE 涉及的字段 。根据s L Q 语句 中使用的查询条件 , 总能够找到一个 性 能最优 的执行方式 。调整S L Q 语句 的写法 , 可以遵循 以下 优化 原则和方法 : 在基于规则的优化方式 ( ue B sd pmi t n 简 R l ae O i z i , — ao 称为R O)的情况下 ,R M子句 中写在最后 的表将作 为驱 动表 B FO 被最后处理 , 在关 联查 询多个表的情况下 , 应选择最有效率 的表

oracle索引优化原则

oracle索引优化原则Oracle索引是数据库优化中非常重要的一部分,它们能够在查询数据时提高查询效率和性能。

然而,在使用Oracle索引时,需要遵守一些原则,以便最大程度地提高查询效率和性能。

以下是一些Oracle索引优化的原则。

1.只在需要时使用索引Oracle索引能够帮助我们提高查询效率和性能,但它们也会降低更新和插入数据的速度。

因此,我们应当仅在需要时使用索引。

如果使用过多的索引,会导致查询语句变得复杂并且更新和插入速度变慢,从而影响整个数据库系统的性能。

2.使用唯一性索引唯一性索引可以帮助我们避免重复数据的插入和更新。

当数据库表中的某个列需要具有唯一性时,我们可以使用唯一性索引来实现。

这将确保同一列中的值不重复,从而提高整个数据库系统的性能。

3.使用复合索引如果查询语句需要同时查询多个列,我们可以使用复合索引来提高查询效率和性能。

使用复合索引时,需要注意索引的顺序,应该从前往后按照查询条件的顺序构建索引。

这样可以避免Oracle优化器无法使用索引而导致的全表扫描。

4.选择正确的索引类型Oracle提供不同的索引类型,包括B树索引、位图索引、函数索引等。

在选择索引类型时,我们应当根据查询语句的类型和数据的特点来选择最适合的索引类型。

例如,如果查询语句需要对大量的布尔类型或枚举类型数据进行查询,那么位图索引可能比B树索引更适合。

5.避免过度索引化过多的索引将会降低数据库系统的性能,每个索引都需要消耗一定的内存和磁盘空间,使得查询和更新操作变得更慢。

因此,我们应避免对相同的列建立多个重复的索引,并仅为确实需要的列创建合适的索引。

6.定期维护索引当数据表中的数据发生变化时,索引也需要随之更新。

因此,我们需要定期进行索引维护和优化,以确保索引数据与实际数据的一致性。

这样可以避免索引中出现“死数据”,也可以提高查询效率和性能。

在某些情况下,Oracle优化器会选择错误的索引,从而影响查询效率和性能。

Oracle优化之执行计划解析


Oracle应用优化
SQL语句的解析过程 什么是SQL执行计划 了解RBO和CBO 如何解读执行计划 NC SQL规范
什么是SQL执行计划
所谓执行计划,就是对一个DML SQL做出一份怎样去 完成任务的执行路径。基于不同的优化方式,执行计划可能 有很大的差异。
什么是SQL执行计划
Oracle应用优化
NC SQL规范
6、避免在索引列上使用计算
使用substr字符串函数的,如: select * from staff_member where substr(last_name,1,4)=’FRED’; ‘%’通配符在第一个字符的,如: select * from staff_member where first_name like ‘%DON’; 字符串连接(||)的,如: select * from staff_member where first_name||’’=’DONALD’
QA
NC SQL规范
8、避免使用IS NULL
设计中尽量避免字段为NULL,不能用NULL代表业 务意义。 例:总帐 凭证的记帐标示等 NC系统里常见(col1=’’ or colx is null)造成诸多效 率问题
NC SQL规范
9、将产生排他锁的操作放到事务的最后
锁等待的避免 死锁产生及其避免
Oracle应用优化
SQL语句的解析过程 什么是SQL执行计划 了解RBO和CBO 如何解读执行计划 NC SQL规范
如何解读执行计划
执行计划阅读方法 执行方法描述 术语解释
执行计划阅读方法
以树状格式进行读取,通过递归进入最底层 ,然后再返回该树的父(第一)。
实际演示
执行方法描述

oracle sql优化常用的15种方法

oracle sql优化常用的15种方法1. 使用合适的索引索引是提高查询性能的重要手段。

在设计表结构时,根据查询需求和数据特点合理地添加索引。

可以通过创建单列索引、复合索引或者位图索引等方式来优化SQL查询。

2. 确保SQL语句逻辑正确SQL语句的逻辑错误可能会导致低效查询。

因此,在编写SQL语句前,需要仔细分析查询条件,确保逻辑正确性。

3. 使用连接替代子查询在一些场景下,使用连接(JOIN)操作可以替代子查询,从而减少查询的复杂度。

连接操作能够将多个数据集合合并为一个结果集,避免多次查询和表的扫描操作。

4. 避免使用通配符查询通配符查询(如LIKE '%value%')在一些情况下可能导致全表扫描,性能低下。

尽量使用前缀匹配(LIKE 'value%')或者使用全文索引进行模糊查询。

5. 注意选择合适的数据类型选择合适的数据类型有助于提高SQL查询的效率。

对于整型数据,尽量使用小范围的数据类型,如TINYINT、SMALLINT等。

对于字符串数据,使用CHAR字段而不是VARCHAR,可以避免存储长度不一致带来的性能问题。

6. 优化查询计划查询计划是数据库在执行SQL查询时生成的执行计划。

通过使用EXPLAIN PLAN命令或者查询计划工具,可以分析查询计划,找出性能瓶颈所在,并对其进行优化。

7. 减少磁盘IO磁盘IO是影响查询性能的重要因素之一。

可以通过增加内存缓存区(如SGA)、使用高速磁盘(如SSD)、使用合适的文件系统(如ASM)等方式来减少磁盘IO。

8. 分区表对于大数据量的表,可以考虑使用分区表进行查询优化。

分区表可以将数据按照某个规则分散到不同的存储区域,从而减少查询范围和加速查询。

9. 批量操作尽量使用批量操作而不是逐条操作,可以减少数据库的事务处理开销,提高SQL执行效率。

可以使用INSERT INTO SELECT、UPDATE、DELETE等批量操作语句来实现。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1.性能优化
●【规则6】尽量避免相同语句由于书写格式的不同,而导致多次语法分析。

●【规则7】尽量使用共享的SQL语句,也就是说,在SQL中尽量采用绑定变量的方式,
而不是常量;
●【规则8】尽量不使用“SELECT *”这样的语句,即使需要查询表中的所有行,也需列
出所有的字段名;
●【规则9】尽量避免4个以上表的链表操作,例如:A = B and B = C and C = D,如果业务
上需要,可以考虑通过中间表的方式进行变通;
●【规则9】大量的排序操作影响系统性能,所以尽量减少order by和group by排序操作。

如必须使用排序操作,请遵循如下规则:
(1)排序尽量建立在有索引的列上。

(2)如结果集不需唯一,使用union all代替union。

●【规则10】系统可能选择基于规则的优化器,所以将结果集返回数据量小的表作为驱
动表(from后边最后一个表)。

说明:驱动表的选择和很多的因素有关系,不仅仅是表的顺序,这点仅做参考,不过养成这个习惯有助于以后进行SQL的优化。

●【规则11】索引的使用。

(1)尽量避免对索引列进行计算。

(2)尽量注意比较值与索引列数据类型的一致性,避免使用数据库的类型自动转换功能
(3)对于复合索引,SQL语句必须使用主索引列
(4)索引中,尽量避免使用NULL。

(5)对于索引的比较,尽量避免使用NOT=(!=)
(6)查询列和排序列与索引列次序保持一致
●【规则12】查询的WHERE过滤原则,应使过滤记录数最多的条件放在最前面。

●【规则13】使用%TYPE、%ROWTYPE方式声明变量,使变量声明的类型与表中的保持同

●【规则14】在IF/ELSE查询中,使用DECODE
●【规则15】在SQL 中使用WHERE 子句过滤数据,而不是在程序中到处使用它进行过

●【规则16】执行动态SQL,建议用execute immediate SQL子句;
●【规则17】尽量避免使用union,若需要排重,建议使用from 子句把查询结果union all
起来后,再通过group by 排重,
如:
SELECT id
FROM (
SELECT id
FROM a
UNION ALL
SELECT id
FROM b
)
GROUP BY id
●【规则18】尽量使用外关联代替not in,not exists操作。

如:
SELECT id,name
FROM a
WHERE id
NOT IN(
SELECT id FROM b);
等同于
SELECT a.id,
FROM a,b
WHERE a.id = b.id(+)
AND b.id IS NULL;
●【规则19】在可以进行批处理的地方,尽量采用批处理的方式,而不是所有的地方都
采用游标的方式,采用游标的方式确实可以完成一些大数据量的工作,但对数据库的资源消耗比批处理要大。

●【规则20】一个语句中含有多个union all,并且执行时间过长的情况下,可以考虑中间
表的方式进行过渡。

●【规则21】对分区表的操作,最好能定位到其中的某个或某几个分区上。

●【规则22】在OLTP的处理中,SQL影响的行数一般都很少,对表一般对需进行索引的
range或unique扫描,如果发现对表进行全表扫描或对索引进行了全索引扫描(index full scan),这种执行计划一般都需要调整,需联系熟悉SQL优化的人员进行调整。

●【规则23】供别的文件或函数调用的函数,禁止使用全局变量交换数据。

相关文档
最新文档