数据库的表空间
程序员文章站
2022-05-08 11:24:45
...
表空间的概述
数据库的表空间,简而言之就是数据库存储数据的存储结构,是一种用来存储数据的逻辑空间,是数据库用来存储数据的最大逻辑单元,其下还有段、区、数据块等逻辑数据类型。表空间的存在就是为了用来存储数据库的数据对象,一个数据库可以由多个数据表空间组成,可以通过表空间来实现对数据库的调参。
表空间的分类
- 永久性表空间:在存储过程中需要永久化存储的对象,比如二维表,视图,存储过程,索引。
- 临时表空间:临时表空间实在数据库执行的过程中创建的,如:执行order by,like,等查询命令时产生的临时数据。操作完之后临时表空间的内容会自动释放,不会对数据库产生影响。临时表空间一般存储在TEMP中,用户也可以自行手动创建临时表空间,手法多样,多变。
- UNDO表空间:保存数据库表修改之前的副本。存储事务修改的旧址,即是为了保存数据修改之前的另一个版本。利于对数据操作的回滚、恢复和撤销。
查看system用户的默认表空间和临时表空间:
SQL> SELECT PROPERTY_NAME, PROPERTY_VALUE
2 FROM DATABASE_PROPERTIES;
PROPERTY_NAME PROPERTY_VALUE
------------------------------ ------------------
DEFAULT_TEMP_TABLESPACE TEMP
默认表空间
用户在登陆后没有指定表空间的话,数据就会默认存储到默认表空间。
查看默认的永久表空间
注意:如果创建用户时,不指定其永久表空间,则会使用默认的表空间
SQL> SELECT PROPERTY_NAME, PROPERTY_VALUE
2 FROM DATABASE_PROPERTIES;
PROPERTY_NAME PROPERTY_VALUE
------------------------------ ------------------
DEFAULT_TEMP_TABLESPACE TEMP
DEFAULT_PERMANENT_TABLESPACE USERS
查看默认的TEMP表空间
系统管理员查看表空间
SQL> SELECT PROPERTY_NAME, PROPERTY_VALUE
2 FROM DATABASE_PROPERTIES
3 WHERE PROPERTY_NAME='DEFAULT_TEMP_TABLESPACE'
4 ;
PROPERTY_NAME PROPERTY_VALUE
------------------------------ ----------------------------
DEFAULT_TEMP_TABLESPACE TEMP
普通用户SELECT USERNAME, TEMPORARY_TABLESPACE FROM DBA_USERS
逻辑结构到物理结构的映射
表空间与数据文件:实际上表空间是由若干个数据文件构成,数据文件的位置和大小可以由我们而定。数据被存放在表空间的数据文件中。
注意:表空间的段,区,块等等是一种逻辑结构,其下最小的数据块会映射到磁盘块中,而磁盘块是物理结构。一个数据块由若干个磁盘块组成。
表空间的操作方式
- 数据字典:表空间的分配信息可以都存储在数据字典中,但是如果真这样做了,会引起字典争用的后果,这是性能调优的目标之一。
- 本地存储:表空间分配不放在数据字典,而在每个数据文件头部的第3到第8个块的位图块,来管理空间分配。
查看表空间使用情况
SELECT A.TABLESPACE_NAME AS TABLESPACE_NAME,
ROUND(A.BYTES/(1024*1024*1024),2) AS "TOTAL(G)" ,
ROUND(B.BYTES/(1024*1024*1024),2) AS "USED(G)" ,
ROUND(C.BYTES/(1024*1024*1024),2) AS "FREE(G)" ,
ROUND((B.BYTES * 100) / A.BYTES,2) AS "% USED" ,
ROUND((C.BYTES * 100) / A.BYTES,2) AS "% FREE"
FROM SYS.SM$TS_AVAIL A, SYS.SM$TS_USED B, SYS.SM$TS_FREE C
WHERE A.TABLESPACE_NAME = B.TABLESPACE_NAME
AND A.TABLESPACE_NAME = C.TABLESPACE_NAME;
计算表空间使用情况(考虑了数据文件自动增长情况):
SELECT UPPER(F.TABLESPACE_NAME) AS "表空间名称",
ROUND(D.AVAILB_BYTES ,2) AS "表空间大小(G)",
ROUND(D.MAX_BYTES,2) AS "最终表空间大小(G)",
ROUND((D.AVAILB_BYTES - F.USED_BYTES),2) AS "已使用空间(G)",
TO_CHAR(ROUND((D.AVAILB_BYTES - F.USED_BYTES) / D.AVAILB_BYTES * 100,
2), '999.99') AS "使用比",
ROUND(F.USED_BYTES, 6) AS "空闲空间(G)",
F.MAX_BYTES AS "最大块(M)"
FROM (
SELECT TABLESPACE_NAME,
ROUND(SUM(BYTES) / (1024 * 1024 * 1024), 6) USED_BYTES,
ROUND(MAX(BYTES) / (1024 * 1024 * 1024), 6) MAX_BYTES
FROM SYS.DBA_FREE_SPACE
GROUP BY TABLESPACE_NAME) F,
(SELECT DD.TABLESPACE_NAME,
ROUND(SUM(DD.BYTES) / (1024 * 1024 * 1024), 6) AVAILB_BYTES,
ROUND(SUM(DECODE(DD.MAXBYTES, 0, DD.BYTES, DD.MAXBYTES))/(1024*1024*1024),6) MAX_BYTES
FROM SYS.DBA_DATA_FILES DD
GROUP BY DD.TABLESPACE_NAME) D
WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME
ORDER BY 4 DESC
懒得copy了,想看原文点下面
转自:点击打开链接
上一篇: ORACLE创建表空间
下一篇: 累计连续签到 设计和实现