Oracle存储结构.docx

上传人:b****6 文档编号:5643515 上传时间:2022-12-30 格式:DOCX 页数:9 大小:19.66KB
下载 相关 举报
Oracle存储结构.docx_第1页
第1页 / 共9页
Oracle存储结构.docx_第2页
第2页 / 共9页
Oracle存储结构.docx_第3页
第3页 / 共9页
Oracle存储结构.docx_第4页
第4页 / 共9页
Oracle存储结构.docx_第5页
第5页 / 共9页
点击查看更多>>
下载资源
资源描述

Oracle存储结构.docx

《Oracle存储结构.docx》由会员分享,可在线阅读,更多相关《Oracle存储结构.docx(9页珍藏版)》请在冰豆网上搜索。

Oracle存储结构.docx

Oracle存储结构

Oracle存储结构分析

一逻辑结构的层次与种类

1,表(table):

2,分区表(tablepartition):

一个有很大数据量的表;我们可以把表分区,每个分区可以放在不同的段上。

以实现对表的优化

3,簇(cluster):

将多个表集合在一起,这些表拥有相同的列;这些相同列放在同一个物理的段里面。

4,索引(index):

5,index-organizedtable(对应sqlserver的群集索引):

这些表中的数据以索引的大小按升序或者降序排列    

6,indexpartition(索引的分区):

关于索引的数据分别存于不同的物理段里面

7,undosegment:

有序循环的方式存储 (存放oldvalue;读一致性;rollback;recovery)

8,temporary:

临时段用来排序

9,LOBsegment:

存放大的数据,oracle里面将这些数据并不放在表内部,而是有专门一个段来存储

10,nestedtable(嵌套表):

一个表中的某个字段的值是另外一个整表!

11,bootstrapsegment:

初始化我们的实例用的。

这个段不需要维护和管理!

  

二oracle存储参数的设定及继承问题

【记忆】默认为Oracledefault ===》Tablespace(创建表空间时定义的参数)====》Segment(优先级最高)

【理解】初始参数oracleblock的5倍;意思是说你创建一个表,即使里面没存数据,它已经占用了8k×5=40kB的空间(这里假设oracleblocksize为8kB)

 

三创建表时可以单独为表指定存储参数

SQL>connhr/123456@kk

已连接。

SQL>createtablehello(idint)

 2 tablespacebkeep

 3 storage(initial100k

 4 next100k); 

【点子】我们来创建一个表空间test11,不带任何存储参数,然后打开oem看看它的存储参数(这些参数就是从oracledefault哪里继承过来的!

  

四extent的分配和重新分配

-         当创建段时就分配空间

-         当扩展段时给它分配空间

-         强制分配空间给段(段可以跨数据文件,但不可以跨表空间;但是强制的段是不能跨数据文件获取空间的)

 

创建表时,最初始的空间一定会分配给它!

SQL>createtablehello(idint)

 tablespacebkeep

 storage(initial100k //意思是,不管表里面有没有数据,都会占掉100k的空间

next100k);

表已创建。

 

五【实验】强制分配分区

1,我们想给hr.hello表在system01.dbf上划分1M的空间,

结果:

ORA-03284:

数据文件d:

/oracle/oradata/kk/system01.dbf不是表空间BKEEP的成员

SQL>altertablehr.hello

 allocateextent(size1mdatafile'd:

/oracle/oradata/kk/system01.dbf');

altertablehr.hello

*

ERROR位于第1行:

ORA-03284:

数据文件d:

/oracle/oradata/kk/system01.dbf不是表空间BKEEP的成员

  

2,现在我们给bkeep表空间增加一个数据文件bkeep03.dbf

SQL>altertablespacebkeep

adddatafile'd:

/oracle/oradata/kk/bkeep03.dbf'size10M;

 

3,再来给hr.hello表在bkeep03.dbf上强制划分1M空间

SQL>altertablehr.hello

allocateextent(size1mdatafiled:

/oracle/oradata/kk/bkeep03.dbf');

 4,这里我们不指定数据文件,那么会不会是在建表的时候指定的那个数据文件上继续扩展呢?

SQL>altertablehr.hello

allocateextent(size1m);

 

【思考】强制分配空间的时候会指定一个数据文件,当给该表分配的空间使用完以后,它将会怎么办?

继续从该数据文件上面获取空间?

还是从由localmanage随机分配空间给它?

    答案:

 

【重点】droptablexxx和truncatetablexxx 都会释放存储空间

 

回收hr.hello表没有用掉的空间

SQL>altertablehr.hello

 deallocateunused;

 

【记忆】datafile分区的使用情况记录在文件的头(filehearder)里面;主要有两种信息:

Usedextent和Freeextent 

 

六databaseblock的大小

I/O读写的最小单位:

读整个块到内存去;同理,内存的使用也以块大小为单位

  块的大小是在创建表空间时指定的

  DB_BLOCK_SIZE这个参数指定了缺省的块大小

 

七【实践检验真理】非标准块的使用方法:

  验证db_16k_cache_size值的影响

oracle现在支持多种块大小的表空间,但是要使用这个功能,必须指定支持对应块大小的内存缓存区!

 

step1:

查看内存区为16k块分配的cache大小;结果:

0

SQL>showparameterdb_16k_cache_size 

NAME                  TYPE       VALUE

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

db_16k_cache_size        biginteger      0

 

step2:

创建表空间bkeep2并指定其blocksize为16KB;结果:

报错

SQL>createtablespacebkeep2

 2 datafile'd:

/oracle/oradata/kk/bkeep202.dbf'size10m

 3 blocksize16k;

createtablespacebkeep2

*

ERROR位于第1行:

ORA-29339:

表空间块大小16384与配置的块大小不匹配

 

step3:

为16k的block在内存中设置缓存;结果:

没有足够内存来增加高速缓存的大小

SQL>altersystemsetdb_16k_cache_size=8m;

altersystemsetdb_16k_cache_size=8m

*

ERROR位于第1行:

ORA-02097:

无法修改参数,因为指定的值无效

ORA-00384:

没有足够的内存来增加高速缓存的大小

 

step4:

收缩其它缓存来给16kblock来用;结果:

标准块缓存12→4,腾出了8m

SQL>altersystemsetdb_cache_size=4m; 

系统已更改。

 

SQL>altersystemsetdb_16k_cache_size=8m; 

系统已更改。

 

SQL>showparameterdb 

NAME                             TYPE       VALUE

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

db_16k_cache_size                   biginteger    8388608

db_8k_cache_size                    biginteger    0

db_block_size                       integer       8192

 

step5:

现在创建块大小为16kB的表空间bkeep2;结果:

成功!

SQL>createtablespacebkeep2

 datafile'd:

/oracle/oradata/kk/bkeep202.dbf'size10m

 blocksize16k;

  

step6:

现在又想db_16k_cache_size=0;结果:

bkeep2表空间在用,所以不能设为0

SQL>altersystemsetdb_16k_cache_size=0;

altersystemsetdb_16k_cache_size=0

*

ERROR位于第1行:

ORA-02097:

无法修改参数,因为指定的值无效

ORA-00383:

DEFAULT高速缓存的块大小16384不能减少至零

 

step7:

把bkeep2表空间连同内容和数据文件全部删除,再来设db_16k_cache_size=0;结果:

ok!

SQL>run

 droptablespacebkeep2

 *includingcontentsanddatafiles 

SQL>altersystemsetdb_16k_cache_size=0; 

系统已更改。

  

【思考】块大小为8k;设对应的cache有如下特点。

db_cache_size=9m 结果:

12M

db_cache_size=5m 结果:

8M

 

SQL>showparameterdb_cache; 

NAME                                TYPE       VALUE

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

db_cache_size                       biginteger     8388608 

SQL>altersystemsetdb_cache_size=9m; 

SQL>showparameterdb_cache; 

NAME                                TYPE       VALUE

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

db_cache_size                       biginteger     12582912 

SQL>showparameterdb_b

NAME                                TYPE       VALUE

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

db_block_size                          integer       8192 

八块的研究

  header:

有多少行!

使用空间的方式是"自上往下"

  freespace:

保留用于更新的空闲空间

  Data:

数据的填充方式是 "自下往上" 

块一级控制对空间的使用

总共有四个参数:

PCTFREE、PCTUSED、INITRANS、MAXTRANS

PCTFREE

PCTUSED

【优化有关】用上面两个参数来控制块中预留的空间大小。

为什么要预留空间呢?

为了将来更新时防止数据变大而导致行移植!

为什么要避免行移植呢?

行移植的意思就是一行记录被放到两个块里面,之间做了指针链接;将来查询这个数据的时候会读取两个块中的全部内容(block是最小读写单位),这样的话I/O负担就翻了一倍!

 

【说明】PCTFREE=20是20%控制insert,为了给将来update用!

呵呵,偏心吧!

 

九查看表的存储参数,在OEM里面

"事务处理数量"----‘初始值’对应‘INITRANS’‘最大值’对应‘MAXTRNS’

意思是:

初始值允许一个事务对这个块的操作,最大的事务数量是255 

十datablock的管理

  自动段空间管理

  手工管理段空间

 自动段管理 --推荐使用

1,借助位图来跟踪当前段的free和use空间

2,对并发数据的插入有更好的性能!

【疑问】如果表空间中包含LOBs对象,那么就不能使用自动段管理(难道我们的系统。

天哪!

) 

【常识】只能在创建表空间的时候指定段管理;以后在这个表空间中创建的对象都将继承它的段管理特性 

【点子】在kong3表空间中创建表test11

OEM中查看表test11的存储特性

 “空闲列表”为灰色的,说明它是自动管理的

 

十一【重点】如何通过字典视图查看空间管理信息?

每个对象所占有的分区都记录在DBA_EXTENTS里面

表空间还有多少自由空间?

DBA_FREE_SPACE

      

表空间从物理上有“数据文件”组成;从逻辑上由“段”组成

物理线路:

DBA_TABLESPACES--→DBA_DATA_FILES--→DBA_FREE_SPACE+DBA_EXTENTS

逻辑线路:

DBA_TABLESPACES--→DBA_SEGMENTS---→DBA_FREE_SPACE+DBA_EXTENTS

 

【重点】这五个视图监控了系统存储这块的非常有用的信息;必须高度重视,经常使用!

DBA_TABLESPACES

DBA_SEGMENTS

DBA_DATA_FILES

DBA_FREE_SPACE

DBA_EXTENTS

 

【技巧】如何判断表空间是local管理还是数据字典管理

SELECT*FROMDBA_TABLESPACE

可以看到“表空间名称”“block_size”“初始分区”“next分区”如果“next分区”为空,说明是local管理

 

【技巧】计算price表所占空间

每个对象所占用的分区都记录在DBA_EXTENTS视图里面

根据这个,我们可以计算authors表所占的空间

计算price表所占空间

SQL>SELECTsum(bytes)fromdba_extents

    whereowner='HR'andsegment_name='PRICE' 

SUM(BYTES)

----------

65536 

【记忆】表空间的作用:

      分离段,方便管理

      控制用户空间的分配(普通表,分区表,cluster,LOBs等等)

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 动物植物

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1