一个常用的数据库的检查脚本
[backcolor=rgb(248,248,248)]SELECT rownum "ID",
[backcolor=rgb(248,248,248)]T1.tablespace_name "表空间名",
[backcolor=rgb(248,248,248)]T1.status "状态",
[backcolor=rgb(248,248,248)]T1.CONTENTS "类型",
[backcolor=rgb(248,248,248)]T1.logging "LOGGING",
[backcolor=rgb(248,248,248)]T1.extent_management "段管理方式",
[backcolor=rgb(248,248,248)]T1.segment_space_management "表空间管理方式",
[backcolor=rgb(248,248,248)]T1.def_tab_compression "是否压缩",
[backcolor=rgb(248,248,248)]T1.bigfile "是否大文件",
[backcolor=rgb(248,248,248)]T2.status "文件状态",
[backcolor=rgb(248,248,248)]T2.autoextensible "是否可扩展",
[backcolor=rgb(248,248,248)]T2.filenum "文件数",
[backcolor=rgb(248,248,248)]T2.total "总大小",
[backcolor=rgb(248,248,248)]nvl(T2.used, T2.total) "已使用",
[backcolor=rgb(248,248,248)]T2.maxsizes "最大可扩展",
[backcolor=rgb(248,248,248)]Nvl2(T2.total, nvl(T2.used, T2.total) / T2.total, 1) "使用率",
[backcolor=rgb(248,248,248)]Nvl2(T2.total, nvl(T2.used, T2.total) / T2.maxsizes, 1) "最大使用率",
[backcolor=rgb(248,248,248)]FSFI "碎片率"
[backcolor=rgb(248,248,248)]FROM dba_tablespaces T1,
[backcolor=rgb(248,248,248)](SELECT A.tablespace_name,
[backcolor=rgb(248,248,248)]status,
[backcolor=rgb(248,248,248)]autoextensible,
[backcolor=rgb(248,248,248)]A.filenum,
[backcolor=rgb(248,248,248)]A.total,
[backcolor=rgb(248,248,248)]A.total - F.free USED,
[backcolor=rgb(248,248,248)]A.maxsizes,
[backcolor=rgb(248,248,248)]FSFI
[backcolor=rgb(248,248,248)]FROM (SELECT tablespace_name,
[backcolor=rgb(248,248,248)]max(decode(status, 'AVAILABLE', 1, 0)) status,
[backcolor=rgb(248,248,248)]max(decode(autoextensible, 'YES', 1, 0)) autoextensible,
[backcolor=rgb(248,248,248)]Count(file_id) FILENUM,
[backcolor=rgb(248,248,248)]SUM(bytes / 1048576) TOTAL,
[backcolor=rgb(248,248,248)]SUM(Decode(maxbytes, 0, bytes, maxbytes)) / 1048576 MAXSIZES
[backcolor=rgb(248,248,248)]FROM dba_data_files
[backcolor=rgb(248,248,248)]GROUP BY tablespace_name) A,
[backcolor=rgb(248,248,248)](SELECT tablespace_name,
[backcolor=rgb(248,248,248)]Round(SUM(bytes / 1048576)) FREE,
[backcolor=rgb(248,248,248)]sqrt(max(blocks) / sum(blocks)) *
[backcolor=rgb(248,248,248)](100 / sqrt(sqrt(count(blocks)))) FSFI
[backcolor=rgb(248,248,248)]FROM dba_free_space
[backcolor=rgb(248,248,248)]GROUP BY tablespace_name) F
[backcolor=rgb(248,248,248)]WHERE A.tablespace_name = F.tablespace_name(+)
[backcolor=rgb(248,248,248)]UNION ALL
[backcolor=rgb(248,248,248)]SELECT A.tablespace_name,
[backcolor=rgb(248,248,248)]status,
[backcolor=rgb(248,248,248)]autoextensible,
[backcolor=rgb(248,248,248)]filenum,
[backcolor=rgb(248,248,248)]total,
[backcolor=rgb(248,248,248)]nvl(F.used, 0) used,
[backcolor=rgb(248,248,248)]A.maxsizes,
[backcolor=rgb(248,248,248)]100 FSFI
[backcolor=rgb(248,248,248)]FROM (SELECT tablespace_name,
[backcolor=rgb(248,248,248)]max(decode(status, 'AVAILABLE', 1, 0)) status,
[backcolor=rgb(248,248,248)]max(decode(autoextensible, 'YES', 1, 0)) autoextensible,
[backcolor=rgb(248,248,248)]Count(file_id) FILENUM,
[backcolor=rgb(248,248,248)]SUM(bytes / 1048576) TOTAL,
[backcolor=rgb(248,248,248)]SUM(Decode(maxbytes, 0, bytes, maxbytes)) / 1048576 MAXSIZES
[backcolor=rgb(248,248,248)]FROM dba_temp_files
[backcolor=rgb(248,248,248)]GROUP BY tablespace_name) A,
[backcolor=rgb(248,248,248)](SELECT tablespace TABLESPACE_NAME,
[backcolor=rgb(248,248,248)]SUM(SU.blocks * To_number(Rtrim(P.value))) / 1048576 USED
[backcolor=rgb(248,248,248)]FROM v$sort_usage SU, v$parameter P
[backcolor=rgb(248,248,248)]WHERE P.name = 'db_block_size'
[backcolor=rgb(248,248,248)]GROUP BY tablespace) F
[backcolor=rgb(248,248,248)]WHERE A.tablespace_name = F.tablespace_name(+)) T2
[backcolor=rgb(248,248,248)]WHERE T1.tablespace_name = T2.tablespace_name(+)
[backcolor=rgb(248,248,248)]表空间名:表空间是数据库的逻辑划分,一个表空间只属于一个数据库。每个表空间由一个或多个数据文件组成。
[backcolor=rgb(248,248,248)]表空间中其他逻辑结构的数据存储在这些数据文件中。在Oracle安装完成后,会自动建立多个表空间,
[backcolor=rgb(248,248,248)]主要有:
[backcolor=rgb(248,248,248)](1)System表空间:该表空间用于存放Oracle系统内部表和数据字典的数据,如表名、列名、用户名等。
[backcolor=rgb(248,248,248)](2)undo表空间:该表空间是存储撤销信息的表空间。当用户对数据库表进行修改(insert,update,delete)时,
[backcolor=rgb(248,248,248)]Oracle会自动使用undo表空间来临时存放修改前的数据。当所进行的修改完成并提交后,系统根据需要保留修改前数据的时间长短来释放undo表空间的部分空间。
[backcolor=rgb(248,248,248)](3)users表空间:该空间是给用户使用的表空间。
[backcolor=rgb(248,248,248)](4)temporary表空间:该表空间是供用户临时使用的,如进行排序、汇总等操作时。
[backcolor=rgb(248,248,248)]状态:
[backcolor=rgb(248,248,248)]表空间的状态有3种
[backcolor=rgb(248,248,248)]ONLINE:这是默认的,表示可以被正常的访问。
[backcolor=rgb(248,248,248)]OFFLINE:表示不能被使用
[backcolor=rgb(248,248,248)]READ ONLY:表示该表空间是只读模式
[backcolor=rgb(248,248,248)]表空间用途分类:
[backcolor=rgb(248,248,248)]PERMANENT - 指定表空间将保存永久对象,这是默认设置
[backcolor=rgb(248,248,248)]UNDO - 存放回滚段
[backcolor=rgb(248,248,248)]TEMPORARY - 指定表空间将用于保存临时对象
[backcolor=rgb(248,248,248)]LOGGIN
[backcolor=rgb(248,248,248)]logging/nologging:表示将来的表、索引等是否需要进行日志处理,默认为需要的。在部分系统可能会使用NOLOGGING+APPEND的方式来降低日志的产生量和提示速度。
[backcolor=rgb(248,248,248)]段管理方式:用来说明表空间是字段管理还是段管理的方式工作。
[backcolor=rgb(248,248,248)]LOCAL - 所谓本地管理,就是oracle不再利用数据字典来记录oracle表空间里面的使用状况,而是在每个表空间的数据文件的头部加入一个位图区,在其中记录每个区的使用状况。每当一个区被使用,或者被释放重新使用,oracle都会更新数据文件的头部这个记录,来记录反映这个变化(默认的非系统SYSTEM永久表空间是本地管理的)
[backcolor=rgb(248,248,248)]DICTIONARY - 数据字典空间管理 dictionary managed tablespace
[backcolor=rgb(248,248,248)]通过管理两个主要的数据字典表,UET$(Used EXtends)和FET$(Free EXtends)来实现
[backcolor=rgb(248,248,248)]在9i以后已淘汰
[backcolor=rgb(248,248,248)]缺点:1并发访问争用
[backcolor=rgb(248,248,248)]2 产生大量redo undo
[backcolor=rgb(248,248,248)]3 空间碎片
[backcolor=rgb(248,248,248)]是否开启的自动拓展的功能:表空间的AUTO EXTEND。
[backcolor=rgb(248,248,248)]使用率:是目前表空间已经使用的大小与该表空间当前的SIZE的比值。
[backcolor=rgb(248,248,248)]最大使用率:是目前表空间已经使用的大小与 该表空间的MAXSIZE大小的比值(在有剩余存储可以保障数据文件增加的情况下这个值才是可以参考的)。
[backcolor=rgb(248,248,248)]碎片率:
[backcolor=rgb(248,248,248)]二. 碎片对系统的影响
[backcolor=rgb(248,248,248)]2.1 导致系统性能减弱
[backcolor=rgb(248,248,248)]如上所述,当要满足一个空间要求时,数据库将首先查找当前最大的自由范围,而"最大"自由范围逐渐变小,要找到一个足够大的自由范围已变得越来越困难,从而导致表空间中的速度障碍,使数据库的空间分配愈发远离理想状态;
[backcolor=rgb(248,248,248)]2.2 浪费大量的表空间
[backcolor=rgb(248,248,248)]部分extent无法得以自动合并,浪费了大量的表空间。
[backcolor=rgb(248,248,248)]三. 自由范围的碎片计算
[backcolor=rgb(248,248,248)]由于自由空间碎片是由几部分组成,如范围数量、最大范围尺寸等,我们可用FSFI(free space fragmentation index:自由空间碎片索引)值来直观体现:
[backcolor=rgb(248,248,248)]FSFI=100*sqrt(max(extent)/sum(extents))*1/sqrt(sqrt(count(extents)))
[backcolor=rgb(248,248,248)]可以看出,FSFI的最大可能值为100(一个理想的单文件表空间)。随着范围的增加,FSFI值缓慢下降,而随着最大范围尺寸的减少,FSFI值会迅速下降。
[backcolor=rgb(248,248,248)]具体碎片整理的办法参看 DB>管理>表空间的碎片整理。