189 8069 5689

oracle怎么持续写入,提高oracle写入速度

如何样向oracle高速插入记录

1:用merge into 进行匹配更新和插入,

创新互联专业为企业提供米脂网站建设、米脂做网站、米脂网站设计、米脂网站制作等企业网站建设、网页设计与制作、米脂企业网站模板建站服务,10多年米脂做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。

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表中提取到一组持续时间,比如说是321秒,但是我想写入5分钟21秒到表格中,请问这该怎么操作?

select trunc(321/3600)||' 小时 '||trunc(mod(321,3600)/60)||' 分 '||mod(321,60)||' 秒' from dual ;

Oracle数据库写入问题!急!急!急!

应该是表锁或者用户锁的问题。需要DBA权限下找到你的SID。然后挂掉他。重新连接。

具体方法

先拥有DBA权限。然后执行以下语句

select t2.username,t2.sid,t2.serial#,t2.logon_time

from v$locked_object t1,v$session t2

where t1.session_id=t2.sid order by t2.logon_time;

--查看锁定的用户及SID

--alter system kill session 'sid,serial#';

--把锁给KILL掉

alter system kill session '146,21177'; --146为SID,21177为serial

如果不能用DBA,只能联系客户了。最简单的办法。重启oracle服务。

希望我的回答对您有所帮助。如果仍有问题可以百度HI联系我。

Oracle中使用PL/SQL怎样用循环插入多条数据?

使用loop循环,比如:

for item in (select a,b,c from table_a where 条件) loop

insert into table_b(a,b,c) values (item.a,item.b,item.c);

end loop;

也可以使用索引表循环,以上只是一个简单的例子,需要根据你的具体情况选择循环方式。

1、采用insert into values 语句插入一条,写很多条语句即可多条数据,这种主要针对于离散值以及一些基础信息的录入,如:insert into test(xh,mc) values('123','测试');

如果插入的数据有规律,可利用for、loop循环插入,主要用于批量生成测试数据

begin

for i in 1 .. 100 loop

insert into test(xh,mc) values(i||'','测试');

end loop;

end ;。

2、采用insert into selct from 语句来一次性插入一个集合,这种主要依据于要插入的数据源已经存储于数据库对象中,或者利用dual虚表来构造数据,经过加工后写入一个集合。

insert into test (xh,mx) select '123','测试' from dual;

3、采用plsql等工具、或者oracle的imp、impdp命令来导入,这种主要用数据库与数据库之间的大批量数据导入,导入的数据格式为plsql的pde、oracle的dmp等。dmp文件可使用

table_exists_action参数控制导入动作:replace替换原表,truncate清除原表数据再导入,append增量导入数据,当然impdp数据泵的导入要依赖于directory路径。

impdp 用户名/密码 dumpfile=123.dmp logfile=123.log directory=imp_dir tables=test table_exists_action=append。

4、使用excel文件直接拷贝。这种主要用于要写入的数据已是excel文件或者行列分明的其它格式文件,每一列的值和表结构相对应,可直接打开表的行级锁,把数据拷贝进入。

oracle 批量写入数据库

用循环,比如一次拉300笔资料来运算,算完再拉300笔

知道结束

oracle每天写入5000w条数据

这个表的数据是所有时间段的都必须查询的么?要不是的话,建议你按时段分成多个表,比如月表,季度表或者年表都可以,需要汇总查询的话,建立个视图就行了,平时只查询当前数据表,能适当减少数据量,效率也高点,至于索引失效不一定是数据量的事情,建议还是查查错误信息,看看有没有其它的原因


网站名称:oracle怎么持续写入,提高oracle写入速度
网页链接:http://cdxtjz.cn/article/hsdosj.html

其他资讯