1、ORACLE修改用户表所属表空间的步骤使用脚本进行修改。据目前所了解,正长情况下需要修改表的空间和表的索引的空间,如果涉及到BOLB字段的表,修改的方式又不一样了!正常情况下的修改脚本:1.修改表的空间alter table TABLE_NAME move tablespace TABLESPACENAME查询当前用户下的所有表select alter table | table_name | move tablespace tablespacename; from user_tables;2.修改表的索引的空间alter index INDEX_NAME rebuild tablespace
2、 TABLESPACENAME查询当前用户下的所有索引select alter index | index_name | rebuild tablespace tablespacename; from user_indexes;可以使用脚本执行查询的结果,这样就可以批量处理!在移植看注意研究了下ORACLE ALTER TABLE MOVE 的语法: ALTER TABLE table_name MOVE ONLINE tablespace_name;通过上面的语句可以移植表到新表空间,如果要移植LOB字典需要参考以下语法:ALTER TABLE table_name LOB (lob_ite
3、m) STORE AS lob_segment ( TABLESPACE tablespace_name (STORAGE.) ENABLE|DISABLE STORAGE IN ROW CHUNK integer PCTVERSION integer RETENTION FREEPOOLS integer CACHE|NOCACHE|CACHE READS INDEX lobindexname(TABLESPACE tablesapce_name(STORAGE.).注解:LOB (lob_item):表中的lob字段STORE AS lob_segment:每个lob字段在表创建后系统都会
4、自动单独创建一个段,可以通过这个参数手动指定一个段名 tablespace_name:LOB字段新的存储表空间(STORAGE.):指定tablespace_name的存储属性 ENABLE STORAGE IN ROW:如果设置了enable storage in row 那么oracle会自动将小于4000bytes的数据存储在行内, 这是ORACLE的默认值,对于大于4000字节的lob字段保存在lob段(同disable storage in row),在表段将保留36-84字节的控制信息。对于disable storage in row,Oracle将lob字段分开保存在lob段中,
5、而仅仅在行位置保留20字节的指针。对于相当于disable storage in row的这部分(也就是单独保存在LOB段的这部分数据),UNDO仅仅是记录指针与相关lob索引改变,如果发生更新操作等DML操作,原始数据将保留在LOB段。 DISABLE STORAGE IN ROW:如果DISABLE这个属性,那么lob数据会在行外存储,行内只存储该lob值得指针,而且这个属性在表创建后只能在MOVE表时才可以被改变 CHUNK:是一个很特别的属性,对一次LOB数据的操作(插入或更新),因该分配多少存储空间,指定的值最好是数据库块的倍数,而且指定的值不能大于表空间区间中NEXT的值, 要不然
6、ORACLE会return一个错误,如果以前已经设置这个值了,那么在后期指定的值是不能被改变的。storage as ( CHUNK bytes )表示对于disable storage in row的这部分,最小的LOB块的大小,必须是数据库块(DB_BLOCK_SIZE)的整数倍。一个chunk最多只保留一行LOB数据,也就是说,如果你设置了32K的CHUNK,但是如果LOB字段大小只有4K,也将占用32K的空间storage as(cache|nocahce)表示是否允许lob段经过buffer cache并缓存。默认是nocache,表示直接读与直接写,不经过数据库的data buff
7、er。所以,默认情况下,对于单独保存在LOB段的这部分数据,在发生物理读的时候,是直接读,如direct path read (lob)storage as(nocache logging |nocache nologging),logging/nologging属性只对nocache方式生效,默认是logging,如果是nologging方式,对于 保存在行外的log部分,在update等DML操作时将不记录redo日志。 PCTVERSION integer、RETENTION:都是ORACLE用来管理LOB字段镜像数据的。在LOB 数据的更新过程中,ORACLE没有用UNDO TABLE
8、SPACE空间,而是从LOB字段所在的表空间里划分一段空间来做镜像空间的,这个空间的大小由PCTVERSION参数控制,默认值为10,代表划分表空间的10%作为镜像空间,每个镜像空间的单元大小由CHUNK参数指定,pctversion可以使用在manual undo mode和automatic undo mode 环境中.retention应用了automatic undo mode中的undo_retention通过时间来管理lob镜像空间.pctversion和retention不能同时被指定.建议数据库在automatic undo mode下使用retention参数。FREEPOO
9、LS integer:给LOG segment指定free list.RAC环境下integer为实例的个数.单实例环境下为1.在automatic undo mode下oracle默认采用FREEPOOLS来管理空闲块列表。除非我们在表的storage配置中指定了freelist groups参数.CACHE|NOCACHE|CACHE READS:指定lob块是否在database buffer中缓存.INDEX lobindexname (TABLESPACE tablesapce_name (STORAGE.):给lob列指定索引存储参数举例:SQL show parameter db
10、_create_file_destSQL create tablespace test datafile size 100M autoextend off;SQL create table test(a varchar2(100), b clob, d blob) pctfree 10 tablespace test;SQL desc testSQL SELECT segment_name,tablespace_name,segment_type FROM dba_segments WHERE tablespace_name=TEST;我们发现每个LOB字段单独有一个LOGSEGMENT和LO
11、BINDEX;SQL set linesize 200col table_name format a5col column_name format a5SELECT b.table_name,a.segment_name,b.index_name,a.segment_type,b.column_name,a.tablespace_name,b.chunk,b.cache,b.freepools,b.pctversion,b.retentionFROM dba_segments a,dba_lobs bWHERE a.segment_name = b.segment_nameAND a.tabl
12、espace_name = TEST/SQL从上面的结果我们可以观察到LOB字段的各个属性.下面我们对LOB字段move到另一个表空间SQL create tablespace lob_test datafile size 100M autoextend off;SQL ALTER TABLE TEST MOVE LOB(B) STORE AS TEST_B (TABLESPACE lob_testDISABLE STORAGE IN ROWCHUNK 16384RETENTIONFREEPOOLS 1NOCACHE);SQL ALTER TABLE TEST MOVE LOB(D) STOR
13、E AS TEST_D (TABLESPACE lob_testDISABLE STORAGE IN ROWCHUNK 16384RETENTIONFREEPOOLS 1NOCACHE);SQL SELECT segment_name,tablespace_name,segment_type FROM dba_segments WHERE tablespace_name=TEST;SQL set linesize 200col table_name format a5col column_name format a5SELECT b.table_name,a.segment_name,b.in
14、dex_name,a.segment_type,b.column_name,a.tablespace_name,b.chunk,b.cache,b.freepools,b.pctversion,b.retentionFROM dba_segments a,dba_lobs bWHERE a.segment_name = b.segment_nameAND a.tablespace_name = LOB_TEST/SQL在一些复杂情况下可能需要连表一起移植alter table table_name move tablespace_name lob (lob_item) store as lob
15、segmentname (tablespace tablespace_name.);移植分区中lobalter table table_name move partition partition_name lob (lob_item) store as logsegmentname (tablespace_name.);移植分区表alter table table_name move partition partition_name tablespace_name lob (lob_item) store as logsegmentname (tablespace_name.);如果不需要修改
16、lobsegmentname,可以同时移植多个列alter table table_name move lob (lob_item1,lob_item2,lob_item3.) store as lobsegmentname (tablespace tablespace_name.); LOB段也可以利用move来重整数据,以下的语句会将表与lob字段move到指定的表空间: alter table table_name move tablespace tbs_namelob(lob_field1,lob_field2) store as (tablespace new_tbs_name);如果LOB字段在分区表中,则增加partition关键字,如 alter table table_name move partition partname tablespace tbs_namelob(field) store as (tablespace new_tbs_name);在数据库中合理的存储LOB列,不仅可以提升性能,而且还可以有效的管理存储空间.
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1