Oracle SQL 性能优化技巧

系统 1820 0

1. 用适合的 ORACLE 化器
     ORACLE
化器共有 3

     A RULE ( 基于 规则 ) b COST ( 基于成本 ) c CHOOSE ( 选择 )

     置缺省的 化器,可以通 过对 init.ora 文件中 OPTIMIZER_MODE 参数的各 声明,如 RULE COST CHOOSE ALL_ROWS FIRST_ROWS 你当然也在 SQL 或是会 (session) 级对 行覆盖。

     了使用基于成本的 化器 (CBO Cost-Based Optimizer) 你必 须经 常运行 analyze 命令,以增加数据 中的 统计 信息 (object statistics) 的准确性。

     如果数据 化器模式 为选择 (CHOOSE) ,那 么实际 化器模式将和是否运行 analyze 命令有 如果 table analyze 化器模式将自 CBO 反之,数据 将采用 RULE 形式的 化器。

在缺省情况下, ORACLE 采用 CHOOSE 化器, 了避免那些不必要的全表 (full table scan) 你必 尽量避免使用 CHOOSE 化器,而直接采用基于 规则 或者基于成本的 化器。


2.
访问 Table 的方式
     ORACLE
采用两 种访问 表中 记录 的方式:

     A 全表

          全表 描就是 序地 访问 表中 记录 ORACLE 采用一次 入多个数据 (database block) 的方式 化全表 描。

     B ROWID 访问

          你可以采用基于 ROWID 访问 方式情况,提高 访问 表的效率, ROWID 包含了表中 记录 的物理位置信息。 ORACLE 采用索引 (INDEX) 实现 了数据和存放数据的物理位置 (ROWID) 系。通常索引提供了快速 访问 ROWID 的方法,因此那些基于索引列的 查询 就可以得到性 能上的提高。


3.
共享 SQL
    
了不重 解析相同的 SQL 句,在第一次解析之后, ORACLE SQL 句存放在内存中。 这块 位于系 全局区域 SGA(system global area) 的共享池 (shared buffer pool) 中的内存可以被所有的数据 共享。 因此,当你 行一个 SQL ( 被称 一个游 ) ,如果它和之前的 句完全相同, ORACLE 就能很快 得已 被解析的 句以及最好的 行路径。 ORACLE 个功能大大地提高了 SQL 行性能并 省了内存的使用。

     可惜的是 ORACLE 对简单 的表提供高速 (cache buffering) 个功能并不适用于多表 查询

     数据 管理 init.ora 为这 个区域 置合适的参数,当 个内存区域越大,就可以保留更多的 句,当然被共享的可能性也就越大了。

     当你向 ORACLE 提交一个 SQL 句, ORACLE 会首先在 这块 内存中 找相同的 句。 里需要注明的是, ORACLE 两者采取的是一 种严 格匹配,要达成共享, SQL 句必 完全相同 ( 包括空格, 行等 )

     数据 管理 init.ora 为这 个区域 置合适的参数,当 个内存区域越大,就可以保留更多的 句,当然被共享的可能性也就越大了。

     共享的 句必 须满 足三个条件:

     A 字符 的比 当前被 行的 句和共享池中的 句必 完全相同。

     B 两个 句所指的 象必 完全相同:

     C 两个 SQL 句中必 使用相同的名字的 (bind variables)


4.
选择 最有效率的表名 ( 只在基于 规则 化器中有效 )
     ORACLE
的解析器按照从右到左的 FROM 子句中的表名,因此 FROM 子句中写在最后的表 ( driving table) 将被最先 理。在 FROM 子句中包含多个表的情况下,你必 须选择记录 条数最少的表作 表。当 ORACLE 理多个表 会运用排序及合并的方式 接它 。首先, 描第一个表 (FROM 子句中最后的那个表 ) 对记录进 行派序,然后 描第二个表 (FROM 子句中最后第二个表 ) ,最后将所有从第二个表中 索出的 记录 与第一个表中合适 记录进 行合并。

     如果有 3 个以上的表 查询 那就需要 选择 交叉表 (intersection table) 表, 交叉表是指那个被其他表所引用的表。


5.WHERE
子句中的
     ORACLE
采用自下而上的 序解析 WHERE 子句,根据 个原理,表之 接必 写在其他 WHERE 条件之前, 那些可以 过滤 掉最大数量 记录 的条件必 写在 WHERE 子句的末尾。


6.SELECT
子句中避免使用 ' * '
    
当你想在 SELECT 子句中列出所有的 COLUMN ,使用 动态 SQL 列引用 '*' 是一个方便的方法。不幸的是, 是一个非常低效的方法。 实际 上, ORACLE 在解析的 程中, 会将 '*' 依次 转换 成所有的列名, 个工作是通 过查询 数据字典完成的, 意味着将耗 更多的 时间


7.
减少 访问 数据 的次数
    
SQL ORACLE 在内部 行了 多工作:解析 SQL 句,估算索引的利用率, 量, 数据 等等。由此可 ,减少 访问 数据 的次数,就能 实际 上减少 ORACLE 的工作量。


8.
使用 DECODE 函数来减少 时间
    
使用 DECODE 函数可以避免重 复扫 描相同 记录 或重 复连 接相同的表。


9.
整合 简单 ,无 关联 的数据 库访问
    
如果你有几个 简单 的数据 库查询语 句,你可以把它 整合到一个 查询 ( 即使它 没有 )


10.
除重 复记录

11. TRUNCATE 替代 DELETE
    
除表中的 记录时 ,在通常情况下, (rollback segments ) 用来存放可以被恢 的信息。 如果你没有 COMMIT ORACLE 会将数据恢 除之前的状 ( 准确地 是恢 除命令之前的状况 )

     而当运用 TRUNCATE 段不再存放任何可被恢 的信息。当命令运行后,数据不能被恢 。因此很少的 源被 用, 时间 也会很短。


12.
尽量多使用 COMMIT
    
只要有可能,在程序中尽量多使用 COMMIT 这样 程序的性能得到提高,需求也会因 COMMIT 放的 源而减少

     COMMIT 放的 源:

     A 段上用于恢 数据的信息。

     B 、被程序 得的

     C redo log buffer 中的空

     D ORACLE 管理上述 3 种资 源中的内部花


13.
记录 条数
    
和一般的 点相反, count(*) count(1) 稍快,当然如果可以通 索引 索, 索引列的 数仍旧是最快的。例如 COUNT(EMPNO)


14.
Where 子句替 HAVING 子句
    
避免使用 HAVING 子句, HAVING 只会在 索出所有 记录 之后才 对结 果集 过滤 理需要排序, 总计 等操作。如果能通 WHERE 子句限制 记录 的数目,那就能减少 方面的 开销


15.
减少 表的 查询
    
在含有子 查询 SQL 句中,要特 注意减少 表的 查询


16.
内部函数提高 SQL 效率。

17. 使用表的 (Alias)
    
当在 SQL 句中 接多个表 使用表的 名并把 名前 Column 上。 这样 一来,就可以减少解析的 时间 并减少那些由 Column 引起的 错误


18.
EXISTS 替代 IN
    
多基于基 表的 查询 中, 足一个条件,往往需要 另一个表 接。在 这种 情况下,使用 EXISTS( NOT EXISTS) 通常将提高 查询 的效率。


19.
NOT EXISTS 替代 NOT IN
    
在子 查询 中, NOT IN 子句将 行一个内部的排序和合并。 在哪 情况下, NOT IN 都是最低效的 ( 查询 中的表 行了一个全表遍 ) 了避免使用 NOT IN ,我 可以把它改写成外 (Outer Joins) NOT EXISTS


20.
用表 接替 EXISTS
    
通常来 采用表 接的方式比 EXISTS 更有效率


21.
EXISTS DISTINCT
    
当提交一个包含一 多表信息 ( 比如部 表和雇 ) 查询时 ,避免在 SELECT 子句中使用 DISTINCT 一般可以考 EXIST

Oracle SQL 性能优化技巧


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论