oracle快速向表中插入记录方法

1:用merge into 进行匹配更新和插入,
2: 开启并行,提高速度
3: 如果可以的话加NOLOGING 不写入日志
4:如果数据有规律的话,分批次执行

1.使用marge快速插入;

MERGE /*+ append */
   INTO A d
USING (select * B where ...) f
    ON (d.account_no = f.account_no)
WHEN MATCHED THEN
    update set acc_date = f.acc_date,...
WHEN NOT MATCHED THEN
    insert values ( f.account_no,f.acc_date..)
/
commit;

2.向表中插入两条记录

SQL> INSERT ALL
  2     INTO toms values(1)
  3     into toms values(2)
  4     select * from dual;

已创建2行。

SQL> commit;


3.在插入时不记录日志记录的快速方法
INSERT的时候可通过APPEND选项不产生归档日志。

alter table aa nologging

alter table aa logging

insert /*+append*/ into ...nologing
select * from ...

insert /*+ append, parallel */ into ods_list_t nologging
select * from ods_list;

但这样不行:整个表可以插入,但要某一个字段则不能加入nologging
insert /*+ append, parallel */ into ods_list_t(a,b) nologging
select a,b from ods_list;

但可以这样:
insert /*+ append, parallel */ into ods_list_t  nologging(a,b)
select a,b from ods_list;

create table ods_list_t nologging as select * from ods_list;

insert /*+ append, parallel */ into ods_list_t nologging
select * from ods_list;


insert /*+ Append parallel(tablename,number) */ into ods_list_t nologging
select * from ods_list;

tablename: 表名
number: 并行度

4、
使用批量拷贝方法
set arraysize 20
set copycommit 5000
copy from username/password@oracle_name append table_name1
using select * from table_name2;

--------------------------------------------------
一、非归档模式下:
没有优化前    (1281372  redo size)
1、单一的使用nologging参数,对redo的产生没有什么影响。  (1214836  redo size)
2、单一的使用append提示,redo的减少很显著              (43872  redo size)
3、nologging+append,更显著                             (1108  redo size)

二、归档模式下:
没有优化前:             
1、单独使用nologging参数,(1231904  redo size)
2、单独使用append提示,  (1245804  redo size)
3、nologging + append,     (3748  redo size)

a、使用nologging参数并不代表在dml操作中,oracle不产生redo,只是对于指定表的更新数据不产生redo,但是oracle还是要记录这些操作,所以无论怎么优化,dml操作肯定要产生redo,但是使用这些参数对redo size的影响还是非常可观的。
b、单独使用nologging参数,对redo size没有多少影响,只有和append配合时,才能产生效果。
c、单独使用append提示,对redo的产生影响很大,这是我到现在都不明白的道理,按说append是绕过freelists,直接去寻找新块,能减少对freelists的争用,为什么会少这么多redo呢?
d、归档模式和非归档模式下,参数影响不一样,尤其是单独使用append参数时,看来oracle对归档模式下出于安全考虑还是要多一些。  

---------------------------------------------------------------------------------

oracle append有什么作用?

请教一下,oracle中append是做什么用的。
  insert /*+append*/ into table1 select * from table2
在使用了append选项以后,insert数据会直接加到表的最后面,而不会在表的空闲块中插入数据。
使用append会增加数据插入的速度。
/*+APPEND*/的作用是在表的高水位上分配空间,不再使用表的extent中的空余空间
append 属于direct insert,归档模式下append+table nologging会大量减少日志,非归档模式append会大量减少日志,append方式插入只会产生很少的undo
不去寻找 freelist 中的free block , 直接在table HWM 上面加入数据。

1. 采用高速的存储设备,提高读写能力,如:EMC 和NetApp,

2. 假如tab1表中的没有数据的话
DROP   TABLE   TAB1;
CREATE   TABLE   TAB1   AS   SELECT   *   FROM   TAB2;
然后在创建索引

3. 用Hint 提示减少操作时间

    INSERT   /*+Append*/   INTO     tab1
                SELECT   *   FROM   tab2;

4. 采用不写日志及使用Hint提示减少数据操作的时间。

建议方案是先修改表为不写日志:
sql> alter   table   table_name   NOLOGGING;

插入数据:

INSERT   /*+Append*/   INTO     tab1
      SELECT   *   FROM   tab2;

插入完数据后,再修改表写日志:
sql> alter   table   table_name   LOGGING;

这里的区别就在于如果插入数据的同时又写日志,尤其是大数据量的insert操作,需要耗费较长的时间。

5. 用EXP/IMP 处理大量数据

(1)给当前的两个表分别改名
alter   table   tab1   rename   to   tab11;
alter   table   tab2   rename   to   tab1;
(2)导出改名前的tab2
exp   user/pwd@...   file=...   log=...   tables=(tab1)
(3)把名字改回来
alter   table   tab1   rename   to   tab2;
alter   table   tab11   rename   to   tab1;
(4)导入数据
imp   user/pwd@...   file=...   log=...   fromuser=user   touser=user   tables=(tab1)

 

### Oracle 数据库插入操作阻塞解决方案 在处理 Oracle 数据库中的插入操作时,可能会遇到由于锁定机制而导致的操作阻塞问题。为了有效解决这些问题,可以采取多种方法。 #### 使用适当的锁模式减少冲突 当多个事务试图同时访问同一资源时会发生阻塞。通过合理设置锁模式,可以在一定程度上缓解这种情况的发生。对于更新操作而言,`UPDLOCK` 可以确保在同一时间只有一个进程能够修改特定记录[^3]。然而,在插入场景下,则应考虑其他类型的锁定策略,例如 `ROW SHARE TABLE LOCK` 或者完全指定显式的锁级别而依赖于默认行为,这样可以让更多并发入顺利进行而互相干扰。 #### 调整应用程序逻辑避免长时间持有锁 优化应用层的设计同样重要。尽量缩短每个事务持续的时间长度,并尽早释放再需要持有的任何锁资源。这意味着应该把必要的业务处理放在尽可能短的小型事务里完成;另外也要注意防止死循环等待现象——即两个以上的事物相互之间都在等待对方释放某些对象上的锁。 #### 利用分区技术提高性能并降低竞争程度 针对大型格实施水平方向上的物理分割(Partitioning),可以使同范围内的数据分布在独立存储结构之中。这样一来仅有助于加速查询速度,而且还可以显著减轻因频繁发生的 DML (Data Manipulation Language) 动作所引起的争用状况。特别是对于那些具有明显分布特征的数据集来说效果尤为明显[^2]。 #### 定期维护统计信息保证计划器效率 保持最新的统计数据可以帮助 CBO(Cost-Based Optimizer 成本基础优化程序) 更好地评估各种执行路径的成本收益比从而做出最优决策。如果缺乏及时更新的信息支持的话,那么即使是最简单的 INSERT INTO ... SELECT FROM 类型语句也可能因为选择了次优路线而陷入困境当中无法自拔。 ```sql -- 更新的统计信息 BEGIN DBMS_STATS.GATHER_TABLE_STATS( ownname => 'SCHEMA_NAME', tabname => 'TABLE_NAME' ); END; / ``` #### 实施有效的监控措施以便快速定位瓶颈所在 最后但并非最次要的一点就是建立起一套完善的实时监测体系用于跟踪正在发生的一切活动迹象。借助像 `v$lock`, `dba_waiters` 这样的动态管理视图以及 AWR 报告工具等手段收集有关当前系统状态的关键指标参数,进而为后续诊断提供坚实依据[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值