`
my_ora
  • 浏览: 28396 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

SQL 优化规则 oracle

阅读更多
群:127881306
(有些规则只有在基于规则的优化器里有效)
1>选择最有效率的表名顺序:
1.把记录少的表放在from子句的最后面一个表.
2.如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表.
原因:ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中写在最后的表(基础表 driving table)将被最先处理. 在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表.当ORACLE处理多个表时, 会运用排序及合并的方式连接它们.首先,扫描第一个表(FROM子句中最后的那个表)并对记录进行排序,然后扫描第二个表(FROM子句中最后第二个表),最后将所有从第二个表中检索出的记录与第一个表中合适记录进行合并.
2> WHERE子句中的连接顺序 :
ORACLE采用自右向左的顺序解析WHERE子句,, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾.
3.>SELECT子句中避免使用 ‘ * ‘
ORACLE在解析的过程中, 需要通过查询数据字典将'*' 依次转换成所有的列名.
4.> 使用表的别名(Alias)
当在SQL语句中连接多个表时, 请使用表的别名并把别名前缀于每个Column上.这样一来,就可以减少解析的时间并减少那些由Column歧义引起的语法错误.
(Column歧义指的是由于SQL中不同的表具有相同的Column名,当SQL语句中出现这个Column时,SQL解析器无法判断这个Column的归属)
5.>减少访问数据库的次数:
当执行每条SQL语句时, ORACLE在内部执行了许多工作: 解析SQL语句, 估算索引的利用率, 绑定变量 , 读数据块等等. 由此可见, 减少访问数据库的次数 , 就能实际上减少ORACLE的工作量.
6.>(可能的话)用TRUNCATE替代DELETE.
当删除表中的记录时,在通常情况下, 回滚段(rollback segments ) 用来存放可以被恢复的信息. 如果你没有COMMIT事务,ORACLE会将数据恢复到执行删除命令之前的状况.
而当运用TRUNCATE时, 回滚段不再存放任何可被恢复的信息.当命令运行后,数据不能被恢复.因此很少的资源被调用,执行时间也会很短.
(TRUNCATE只在删除全表里的记录时适用,TRUNCATE是DDL不是DML)
7.> (可能的话)使用COMMIT
只要有可能,在程序中尽量多使用COMMIT, 这样程序的性能得到提高,需求也会因为COMMIT所释放的资源而减少:
COMMIT所释放的资源:
a. 回滚段上用于恢复数据的信息.
b. 被程序语句获得的锁
c. redo log buffer 中的空间
d. ORACLE为管理上述3种资源中的内部花费
8.>(可能的话)用Where子句替换HAVING子句
尽量少使用HAVING子句, HAVING 只会在检索出所有记录之后才对结果集进行过滤. 这个处理需要排序,总计等操作. 如果能通过WHERE子句限制记录的数目,那就能减少这方面的开销.
9.>(某些情况下)可以用EXISTS替代IN . NOT EXISTS替代NOT IN
性能比较:
1.Select * from t1 where x in ( select y from t2)
2.select * from t1 where
exists ( select 1 from t2 where t2. y = t1.x )
当t1记录比较少,t2比较大时适合用exists(exists大部分情况会利用到index),当子查询记录集很小时用in比较合适.
原因分析:
1.Select * from T1 where x in ( select y from T2 )
执行的过程相当于:
select *   from t1, ( select distinct y from t2 ) t3 where t1.x = t3.y;
2. select * from t1 where exists ( select 1 from t2 where t2.y = t1.x )
执行的过程相当于:
for x in ( select * from t1 ) loop
      if ( exists ( select 1 from t2 where t2.y = t1.x )
      then
         OUTPUT THE RECORD
      end if
end loop
这样表 T1 要被完全扫描一遍 .
所以可以得出结论:当t1记录比较少,t2比较大时适合用exists(exists大部分情况会利用到index),当子查询记录集很小时用in比较合适.
10.>用表连接替换EXISTS
改进第9打优化规则的例子.
11.>用EXISTS替换DISTINCT
EXISTS 使查询更为迅速,因为RDBMS核心模块在子查询的条件一旦满足后
立刻返回结果. DISTINCT会先进行排序,然后会根据排序后的顺序去除相同的行.
12.>使用显式的游标(CURSOR)
使用隐式的游标,将会执行两次操作. 第一次检索记录, 第二次检查TOO MANY ROWS 这个exception . 而显式游标不执行第二次操作.
11-例:
1.(低效)SELECT DISTINCT DEPT_NO,DEPT_NAME
FROM DEPT D,EMP E
WHERE D.DEPT_NO = E.DEPT_NO ;
2.高效:
SELECT DEPT_NO,DEPT_NAME
FROM DEPT D
WHERE EXISTS ( SELECT *
FROM EMP E
WHERE E.DEPT_NO = D.DEPT_NO);
• 13.用索引提高效率
通常,通过索引查询数据比全表扫描要快. 当ORACLE找出执行查询和Update语句的最佳路径时, ORACLE优化器将使用索引.
除了那些LONG或LONG RAW数据类型, 你可以索引几乎所有的列. 在大型表中使用索引特别有效.
虽然使用索引能得到查询效率的提高,但是我们也必须注意到它的代价. 索引需要空间来 存储,也需要定期维护, 每当有记录在表中增减或索引列被修改时, 索引本身也会被修改. 这意味着每条记录的INSERT , DELETE , UPDATE将为此多付出4 , 5 次的磁盘I/O . 因为索引需要额外的存储空间和处理,那些不必要的索引反而会使查询反应时间变慢.
定期的重构索引是有必要的.
ALTER INDEX <INDEXNAME> REBUILD <TABLESPACENAME>
分享到:
评论

相关推荐

    oraclesql优化_Oracle中优化SQL的原则.pdf

    oraclesql优化_Oracle中优化SQL的原则.pdf

    Oracle_SQL优化规则

    以下是一些关键的Oracle SQL优化规则: 1. **选择合适的索引**:索引可以加速数据检索,但创建和维护索引也会消耗资源。为经常出现在WHERE子句中的列创建索引,特别是主键和外键。避免在高基数(unique或接近unique...

    sqlserver自动生成sql语句工具sqlserver转oracle

    3. 规则和约束:SQL Server的规则和约束在Oracle中可能需要重新定义,如检查约束、默认值、触发器等。 4. 性能优化:Oracle可能有更佳的性能调优策略,如索引类型、分区策略等,迁移后可能需要进一步优化。 5. ...

    《基于Oracle的SQL优化》PDF版本下载.txt

    根据提供的文件信息,本文将对《基于Oracle的SQL优化》这一主题进行深入解析,包括但不限于SQL优化的重要性、Oracle数据库的特点以及具体的SQL优化方法等。 ### SQL优化的重要性 SQL(Structured Query Language)...

    Oracle_SQL优化脚本_完整实用资源

    Oracle SQL优化是数据库管理员和开发人员提升系统性能的关键技能之一。这个"Oracle_SQL优化脚本_完整实用资源"压缩包包含了一系列工具和方法,旨在帮助你优化在Oracle数据库上运行的SQL查询,从而提高数据库的响应...

    oracle SQL优化技巧

    在基于规则的优化器中,Oracle 的解析器按照从右到左的顺序处理 FROM 子句中的表名。因此,在 FROM 子句中写在最后的表(基础表)将被最先处理。在 FROM 子句中包含多个表的情况下,需要选择记录条数最少的表作为...

    ORACLE-SQL性能优化大全.pdf

    - **SQL优化机制**: - **SQL语句处理过程**:理解SQL语句在Oracle中的处理流程对于优化至关重要。 - **共享SQL区域**:Oracle会在内存的共享池中缓存已执行过的SQL语句,以便后续执行时可以直接使用而无需重新...

    SQL优化在Oracle10g调优中的应用

    ### SQL优化在Oracle10g调优中的应用 #### 引言 随着信息技术的发展和企业对数据处理能力的需求日益增长,Oracle数据库系统因其强大的功能、可靠性和灵活性而在国内外市场上占据了重要地位。特别是在大中型企业中...

    ORACLE数据库中SQL优化解析.pdf

    在ORACLE数据库中,SQL优化是指通过一系列手段来提高SQL语句的执行速度,以减少对系统资源的消耗,提高整体性能。 首先,了解SQL语句的执行过程是进行优化的前提。SQL语句的执行主要分为四个阶段:语法阶段、优化...

    Oracle 性能优化之 SQL优化

    ### Oracle 性能优化之 SQL优化 #### 一、引言 在数据库应用中,SQL查询性能直接影响到系统的响应时间和整体性能。对于大型企业级应用而言,优化SQL语句不仅能够提升用户体验,还能显著降低服务器负载,从而节省...

    ORACLE_SQL性能优化(全).ppt

    SQL优化衡量指标** 性能通常通过响应时间和并发性来衡量。性能不佳可能是由于开发人员对SQL效率的忽视或对SQL执行原理的不了解。优化不仅限于SQL语法和内嵌函数的掌握,还需理解SQL解析和成本基优化器(CBO)的工作...

    oracle优化-SQL优化

    以下是从给定文件中提炼出的关于Oracle数据库优化和SQL优化的知识点: 数据库架构优化: 1. 数据库规划原则应考虑最大可重用化,确保数据库的资源可以高效地被利用。例如,创建索引时选择占用资源最少的数据类型...

    ORACLE 19C SQL调优指南 中文版 Oracle DBA

    13. **SQL优化工具**:Oracle提供了一些内置工具,如SQL Tuning Advisor和Automatic Workload Repository (AWR),它们可以帮助识别性能问题并提出优化建议。 Oracle 19C SQL调优是一门深入且实践性强的学问,需要...

    Oracle 高性能SQL优化

    Oracle数据库的高性能SQL优化是数据库管理员和开发人员关注的关键领域,因为它直接影响到系统的响应时间和整体性能。Oracle性能管理是一个持续的过程,包括主动和被动两个方面。主动性能管理强调在系统设计和开发...

    大道相通,得鱼忘筌 - 从Oracle的SQL优化到MySQL的SQL优化.pdf

    接下来,我们将探讨Oracle和MySQL在SQL优化方面的共性和差异性,以及这些知识如何帮助数据库管理员(DBA)在不同环境中实施有效的SQL优化。 首先,我们要明确两个数据库系统的基本架构。Oracle数据库是一个功能强大...

    基于Oracle数据库的SQL优化原则和方法.pdf

    【SQL优化原则】 1. **减少I/O操作**:I/O操作是数据库性能的瓶颈之一。优化的目标是尽量减少磁盘读写,避免不必要的数据传输,以减轻CPU的负担。 2. **优化排序操作**:频繁的排序操作会导致额外的计算开销,应当...

    oracle sql优化100条

    以下将详细解读部分Oracle SQL优化原则,涵盖查询执行计划、表扫描方式、SQL语句优化及数据访问顺序等方面。 #### 1. 查询执行计划的选择模式 Oracle提供了三种查询执行计划选择模式:`RULE`(基于规则)、`COST`...

    ORACLE培训SQL性能优化.pptx

    ORACLE 优化器共有三种模式:RULE(基于规则)、COST(基于成本)和 CHOOSE(基于选择)。我们可以通过设置启动参数文件中的 OPTIMIZER_MODE 参数来选择优化器模式。 在 SQL 语句优化过程中,我们需要注意一些重要...

Global site tag (gtag.js) - Google Analytics