当前位置:文档之家› ORACLE缓存表

ORACLE缓存表

数据库监听器停止与启动
切换至安装oracle数据库的那个用户,一般为oracle(在root下是安装或是启动不了oracle的);
# su oracle
然后启动监听器
# lsnrctl start
会看到启动成功的界面;
停止监听器命令.
lsnrctl stop
可以修改oracle的ora文件,对数据库进行配置,在opt/oracle/product/9.2.0/network/admin 目录中,修改相应的ora文件即可.



就目前网络上出现的有关“Oracle缓存表”的疑问,小编在网上查找整理了一些,希望能帮助到大家。

Oracle缓存表(db_buffer_pool)由三部分组成:

buffer_pool_defualt

buffer_pool_keep

buffer_pool_recycle

如果要把表钉死在内存中,也就是把表钉在keep区。相关的命令为:

alter table 表名 storage(buffer_pool keep); 这句命令把表示表如果缓存的话是缓存在keep区。

可以通过语句:

select table_name from dba_tables where buffer_pool='KEEP';查询到该表是放在keep区中的。 但是不意味着表已经被缓存了。

下面的语句把表缓存:

alter table 表名 cache; 可以通过

select table_name from dba_ tables where rtrim(cache)='Y' 查询到该表已经被缓存了。

加入到keep区的表不是说不能被移出内存,不过是比较不容易移出内存。

也可以手工来移出内存,命令如下:

alter table ... nocache;










Cache Connect to Oracle 是 Oracle 内存数据库 TimesTen 的一个选件,可以为 Oracle 数据库提供实时的可更新缓存。缓存表驻留在应用程序层,并从后端系统卸载计算周期,从而实现响应能力极强且可伸缩的实时应用程序。(产品数据表)

企业数据库中的大部分数据都是历史数据,并且很少有人访问。但是,掩藏在这些数据下面的信息应该能够在被请求时可即时访问。您的最佳客户、未完成的订单、最近的事务以及产品目录都是很好的示例。Cache Connect to Oracle 能够在 Oracle 内存数据库 TimesTen 中自动复制和管理这些信息,以供他人实时访问。Cache Connect to Oracle 提供了 Oracle 数据库与 Oracle 内存数据库 TimesTen 之间的连接和双向数据传输。



大多数缓存产品都是只读的,因此只限于一组很少的功能。由于 Cache Connect to Oracle 支持完全的 SQL 读/写操作,因此可以用于众多不同种类的应用程序。例如,以网速捕获和处理数据、在线商务、证券交易系统、计费、实时业务流程监控、实时数据分析,以及只读缓存不适用的其他事务处理系统。其他示例还包括引用数据(如订阅者配置文件)以及查询表以了解授权和网络配置,其中缓存在每个处理周期开始时加载,随后在发生更改时更新。

Cache Connect to Oracle 是为使用 Oracle 数据库特性和界面

专门设计的。该产品支持与 Oracle 数据库相同的推荐
数据库字符集和主流数据类型,以确保能够通过兼容的语义和操作存储和处理数据。

Cache Connect to Oracle 使用了“缓存组”的概念,来描述一组映射到 Oracle 数据库中的所有表或部分表的内存数据库表。缓存组可以包含这些表的所有或部分行和列。可以使用多个缓存组来缓存 Oracle 数据库中不同的相关表集合。

对 Oracle TimesTen 中缓存表的更新可以同步或异步地写入 Oracle 数据库,这取决于性能和一致性之间的折衷。 对于只读缓存组,Oracle 数据库的增量更新只能异步刷新到 Oracle TimesTen 中的缓存表。

Cache Connect to Oracle 的设计为即使在 Oracle 数据库服务器或网络连接丢失的情况下也能继续运行。 系统可以跟踪向 Oracle TimesTen 中的缓存表提交的事务,并在连接恢复时立即将其传送到 Oracle 数据库。 同样,系统还可以跟踪向 Oracle 数据库中的缓存表提交的事务,并在与 Oracle 数据库的连接恢复时立即将其刷新到 Oracle TimesTen。








2008-06-28
Oracle 高速批量速插入数据 解决方案
最近做短信群发项目有一个需求,需要客户大批量(十万级)导入数据.
开始是用insert单条数据,10万条数据要20分钟
后来发现可以用insert all 一条sql一次导入500条记录,这样10万条数据只用了1.5分钟,导入速度提高了近来20倍
下面就使用insert all的心得体会记录如下.
使用方法:
insert all into table_name(col_1,col_2) values (value_1,value_2)
into table_name(col_1,col_2) values (value_1,value_2)
into table_name(col_1,col_2) values (value_1,value_2)
.........................................................................
into table_name(col_1,col_2) values (value_1,value_2)
select 1 from dual
需要注意几点:
1.此sql语法上要求后面有select,在本例中,select 1 from dual其实是没有意义的,但必须加上,维护语法上的完整性.
2.所有列数不能超过1000,超过抛出异常
3.oracle 9i版本及以上版本支持此语法








大量Insert时ORACLE在做什么
首先ORACLE遵循一下一些原则:
1. Insert的数据首先保存在内存中,SGA的块高速缓冲区中(以下简称 Block Buff)。
2. Insert操作将产生回滚信息,保存在回滚段中。回滚段信息同样首先在SGA块Buff中缓存(简称 Rollback Buff)。
3. 1和2都将产生重做日志信息。重做日志同样先在SGA的重做日志高速缓冲区中缓存(简称 Redo Buff)。
4. Commit时,ORACLE只是将Rollback Buff和Redo Buff中的数据写到相应的文件中。

为方便讨论,假设Insert的每条记录刚好占用一个块,Block Buff可缓存200块的数据。

case 1:在Insert <200条记录并Commit时,所有的数据可在Bloc

k Buff中缓存,没有问题。
case 2:Insert>200条记录时,部分数据
无法在Block Buff中缓存,将出现什么情况?
在Commit之前,在Block Buff满时,进行块的置换操作。同时所有的Insert操作都会产生Rollback记录。在Commit之后重新进行Select All将会产生什么情况(这时Block Buff无法保存所有的数据)?剩余的数据何时写入到磁盘中?











ORACLE insert 性能比较
在Oracle数据库中,不是提交越频繁越好。恰恰相反,批量提交可以得到更好的性能。这篇文章给大家简单展示一下在Oracle数据库中逐行提交于批量提交两者之间的性能差别。最后再给出一种可以极大改变性能的方法。

1.创建表t_ref,并初始化880992条数据,用于后面的。实验
sec@ora10g> create table t_ref as select * from all_objects;

sec@ora10g>insertinto t_ref select * from t;

220248 rows created.

sec@ora10g> /
sec@ora10g> /
sec@ora10g> /
sec@ora10g> /
sec@ora10g> /

440496 rows created.

2.编写一个简单的PL/SQL块来模拟逐行提交的情况,注意观察执行时间。
我们的目标是将t_ref表中的数据全部插入到t中。
sec@ora10g> set timing on

sec@ora10g> DECLARE
2 BEGIN
3 FOR cur IN (SELECT * FROM t_ref) LOOP
4 INSERT INTO t VALUES cur;
5 COMMIT;
6 END LOOP;
7 END;
8 /

PL/SQL procedure successfully completed.

Elapsed: 00:03:12.77

逐行提交的情况下,一共用时3分12秒。

3.再来模拟批量提交的情况。
sec@ora10g> truncate table t;

Table truncated.

sec@ora10g> DECLARE
2 v_count NUMBER;
3 BEGIN
4 FOR cur IN (SELECT * FROM t_ref) LOOP
5 INSERT INTO t VALUES cur;
6 v_count := v_count + 1;
7 IF v_count >= 100 THEN
8 COMMIT;
9 END IF;
10 END LOOP;
11 COMMIT;
12 END;
13 /

PL/SQL procedure successfully completed.

Elapsed: 00:01:27.69

此时共用时1分27秒,大约是逐行提交方法一半的时间。由此可见,对于Oracle应该尽量以批量提交的方式来完成工作。

4.最后我们使用Oracle更高级的方法完成上面的任务,体验一下极限速度。
sec@ora10g> DECLARE
2 CURSOR cur IS
3 SELECT * FROM t_ref;
4 TYPE rec IS TABLE OF t_ref%ROWTYPE;
5 recs rec;
6 BEGIN
7 OPEN cur;
8 WHILE (TRUE) LOOP
9 FETCH cur BULK COLLECT
10 INTO recs LIMIT 100;
11 FORALL i IN 1 .. recs.COUNT
12 INSERT INTO t VALUES recs (i);
13 COMMIT;
14 EXIT WHEN cur%NOTFOUND;
15 END LOOP;
16 CLOSE cur;
17 END;
18 /

Elapsed: 00:00:09.75

此时我们仅仅使用了不到10秒的时间就完成了曾经需要几分钟才能完成的任务。

5.小结
在Oracle数据库中,频繁的COMMIT会引起大量Redo Log的物理I/O,会极大的限制的性能。

因此,为提高数据库性能,尽可能的批量提交。数据库













海量数据插入
的各种方案试验,大家来分析下
前提:
源表:一千万条以上记录,54个字段.exp导出文件2.8G以上。
目的表:无索引,空表
试验:A.本地插入。B.跨库插入

初始化
SQL> select count(*) from A;
COUNT(*)
--------------------
11387512
已用时间: 00: 00: 47.08
SQL> create table test as select * from A where 1<0;(无索引)
表已创建。
已用时间: 00: 00: 00.02
SQL> alter table test move tablespace mydata;
表已更改。
已用时间: 00: 00: 00.00
默认表空间太小。

A.本地插入
1。直接insert into
SQL> insert into test select * from A;

已创建11387512行。

已用时间: 00: 07: 22.02
2。nologing
SQL> insert into test NOLOGGING select * from A;

已创建11387512行。

已用时间: 00: 07: 18.01
3。append参数
SQL> insert /* +append*/into test nologging select * from A;

已创建11387512行。

已用时间: 00: 07: 29.04
4。copy命令
爆慢,等了一个小时以上,把进程关了。(当时看见进程在“锁”中,不知为何,我菜,不懂)

B跨库插入
1。直接insert into
SQL> insert into test select * from A@ora1;

已创建11840772行。

已用时间: 00: 15: 29.09
2。nologing
SQL> insert into test nologing select * from A@ora1;(nologing和nologging有区别吗?)

已创建11840772行。

已用时间: 00: 14: 15.01
3。append参数
SQL> insert /* +append*/into test nologing select * from A@ora1;

已创建11840772行。

已用时间: 00: 14: 17.01
另外,有人说是nologing,有人说是nologging,昏了,再做了次
SQL> insert /* +append*/into test nologging select * from A@ora1;

已创建11840772行。

已用时间: 00: 14: 12.05
4。copy命令
set copycommit 1;
set arraysize 5000;
copy from scott/tiger@ora1 -
insert test -
using -
select * from A;
耗时两小时+,昏了。
5。imp导入,更爆慢,耗时5小时+,没等出结果直接取消了,浪费了一个下午+半个早上。不过当时imp时test表是有索引的,没有删除!,也是远程imp,还要考虑网络问题。


相关主题
文本预览
相关文档 最新文档