oracle笔记--DML语句优化

  当oracle的DML操作性能受到影响可以从以下因素方面来考虑改善新能。

  1)where子句的效率

where子句是否的条件关联是否利用到了索引,统计信息的维护例直方图等来帮助提升效率的手段

2)索引带来的成本

  索引虽然为查询提升了效率但是对于增删改操作确定带来了成本。向表中插入一条数据时会在索引空间中生成一条记录,oracle的索引时以b树的方式来维护的。当插入的数据量过多是需要对节点进行调整来恢复索引树的高度

3)触发器的成本

4)完成性约束的成本

当触发大批量的操作的时候触发器和完整性的约束成本也不容忽视。

  1. insert语句的优化:

    1. 使用批量操作

      批量操作是尽量将对同一张的表的多次插入合并到一起一次插入多条数据,减少数据库和应用程序之间的交互带来的开销。

    2. 使用append直接载入数据

      使用append直接载入数据,避免了常规插入式数据写入缓存的一步,而是直接将数据写入磁盘中。常规的insert写入高速缓存中然后将高速缓存中,然后检索出段空间中的数据块中可插入数据空间将数据写入。append之间申请空闲的数据块将数据插入。append操作减少了对高速缓存区的争用以及redolog日志的产生量。

      使用append hit的时候需要考虑到系统磁盘io子系统的性能。对于慢速的IO子系统来说可能带不来性能的提升甚至有可能造成系能下降。同时需要注意的是append将会给表加一个全表锁或或者一个分区锁

    3. 使用并行来提升效率

      使用并行线程可以是多个线程来完成完成插入操作提升性能。但是需要考虑到磁盘的驱动。如果是但磁盘驱动可能会将并行的写请求加入到队列中串行的操作。这样并不能带来系能的提升,反而可能因为多线程对资源的争用带来系能的下降

    4. 使用insert all语句来同时对多个表操作

      当出现以下从一个表中获取数据插入到根据不同条件插入不同的表时可以考虑使用insert all。譬如

      1. insert all
      2. when  a = xxx into A (col1,clo2)
      3. values(v1,v2)
      4. when  a = xxx into B(col1,col2)
      5. values(v1,v2)
      6. select * from B
  2. 删除优化
    1. 使用truncate避免使用delete

      默认TRUNCATE要回收空间,且会将所有的脏块写回到数据文件。truncate table后,oracle会回收表和其表中所在的索引到initial 大小并重置HWM。所以truncate table可能比delete慢

    1. 直接删除整个分区
    2. 使用逻辑删除
  3. 更新

    update table A aset a.c1 = (select b.c1 from B b where a.id = b.id)where exists(select 1 from B b where a.id = b.id )

    可以考虑使用以下方式来更新表中的数据避免对B的两次查询

    update (select a.c1 a_c1, b.c1 b_c1 from A a, B where a.id = b.id)
    set a_c1 = b_c1
时间: 2024-10-06 08:33:25

oracle笔记--DML语句优化的相关文章

Oracle之sql语句优化

项目中虽然使用了orm映射,但Oracle系统的优化还是很有价值的,这里从sql语句的角度对常用的语句做下总结. 1.from字段中的优化: Oracle安照从右到左的顺序加载表数据,应该把可以排除数据最多的表放到后面(基础表). 比如,在关联查询中,把课程表放到后面,成绩表放到前面,因为课程表数据一般比较少,关联的时候可以快速的过滤掉一些成绩数据. 2.where中的优化: 对可以过滤数据最多的,放到后面,原理也是Oracle执行从下到上(从右到左)的顺序. 3.使用列名替代*: 省去从字典表

Oracle的update语句优化研究

最近研究sql优化,以下文章转自互联网: 1.     语法 单表:UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值 如:update t_join_situation set join_state='1'whereyear='2011' 更新年度为“2011”的数据的join_state字段为“1”.如果更新的字段加了索引,更新时会重建索引,更新效率会慢. 多表关联,并把一个表的字段值更新到另一个表中的字段去: update 表a set a.字段1 = (sele

MYSQL学习笔记——sql语句优化工具

前面讲解了很多mysql的基础知识,这一章讲解mysql的语句优化. 一.定位慢查询                                                                                 我们要对sql语句进行优化,第一步肯定是找到执行速度较慢的语句,那么怎么在一个项目里面定位这些执行速度较慢的sql语句呢?下面就介绍一种定位慢查询的方法. 1.1.数据库准备 首先创建一个数据库表: CREATE TABLE emp (empno MED

[转]Oracle的update语句优化研究

原文地址:http://blog.csdn.net/u011721927/article/details/39228001 一.         update语句的语法与原理 1.     语法 单表:UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值 如:update t_join_situation set join_state='1'whereyear='2011' 更新年度为"2011"的数据的join_state字段为"1".如果

ORACLE 中 SQL语句优化

(1) 选择最有效率的表名顺序(只在基于规则的优化器中有效):  ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表.如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表.    (2) WHERE子句中的连接顺序.:  ORACLE采用自下而上的顺序解

Oracle 基础 —SQL语句优化的途径

一:SQL语句的优化途径 1.选择合适的Oracle优化器 (1).RBO 基于规则进行优化的优化器   --Oracle 10G 后被抛掉 (2).CBO基于成本(CPU 和 内存的占用率)优化的优化器  --优化器使用的模式根据目标而定 CBO 的优化模式: Rule:基于规则 Choose:默认,表或者索引有统计信息,走CBO模式,否则走RBO 模式 First row:表中有统计信息时,以最快方式返回查询的前几行,总体减少响应时间 All row:表中有统计信息时,以最快方式返回表的所有

oracle常见sql语句优化

1.* 号引起的执行效率 尽量减少使用select * 来进行查询,当你查询使用*, 数据库会进行解析并将*转换为全部列. select count(si.student_id) from Student_info si(student_id为索引) 与 select count(*) from Student_info si 执行时.上面的语句明显会比下面没有用索引统计的语句要快 2.避免在索引列上使用计算. WHERE 子句中,如果索引列是函数的一部分.优化器将不使用索引而使用全表扫描. 举

MYSQL学习笔记——sql语句优化之索引

上一篇博客讲了可以使用慢查询日志定位耗时sql,使用explain命令查看mysql的执行计划,以及使用profiling工具查看语句执行真正耗时的地方,当定位了耗时之后怎样优化呢?这篇博客会介绍mysql中最简单快速的优化方法——添加索引. 一.索引的添加                                                                              mysql一共有四类索引,分别是主键索引.唯一索引.普通索引以及全文索引. 1.1.主

Mysql DBA 高级运维学习笔记-DML语句之insert知识讲解

9.9.7.8 往表中插入数据 (1)命令语法 Insert into<表名>[(<字段名1>[-<字段名n>])]values(值1)[,(值n)] (2)新建一个简单的测试表test1 Create Table: CREATE TABLE `test1` ( `id` int(4) NOT NULL AUTO_INCREMENT, `name` char(20) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT