oracle的temporary tablespace和temporary tablesoace groups

本文详细介绍了Oracle数据库中临时表空间的概念及其作用,包括索引创建、排序操作、分组等场景的应用。此外还探讨了如何通过调整参数来优化临时表空间的使用,并提出了合理的配置建议。

今天在做测试中学到了一个新的知识点,就来写博客,虽然我知道没人看,留着当自己的笔记,以供以后复习。

临时表空间的概念

临时表空间主要是用来做查询和存放一些缓冲区数据。临时表空间消耗的主要原因是需要对查询的中间结果进行排序。

为了释放临时表空间的空间我们可以通过重启数据库即可。但是如果我们没重启实例而一直保持问题sql语句的执行,临时表空间会一直增长指导磁盘空间消耗完。

有人猜测在磁盘空间的分配上,oracle使用的是贪心算法,也就是说上次使用的临时表空间假如大小为1G,那么等我们再次启动数据库的时候临时表空间就和上次的大小一致,即为1G。

临时表空间的作用

1、索引create或rebuild

2、order by 或group by

3、distinct操作

4、union或intersect或minus

5、sort-merge joins

6、analyze


当然,当我们做排序操作的时候并不是马上就用到临时表空间来分配临时段的,而是先存在pga(程序全局区)中的SORT_AREA_SIZE,但这个区域是有一定大小的,当空间用尽时就会使用临时表空间地空间来存。当然我们可以调整SORT_AREA_SIZE的大小,调整足够大的话是不是永久都用不到临时表空间了呢?答案是对的,但是理想是美好的,因为调大SORT_AREA_SIZE的大小就意味着要调大pga的大小,但是内存大小等多方面的限制,这个pga的大小往往是有限制的,可以说其他的应用程序占用的空间,所以调足够大的pga只是一种理想的想法,并不实际。但如果我们的数据库主要是用来查询或者排序分组或索引等操作时,是可以适当加大pga的大小从而来调整SORT_AREA_SIZE的大小的。相反,如果数据库是用来更新数据的那就乖乖用表空间吧。


建用户不指定临时表空间的影响

我们都知道新建一个新用户是不需要指定默认的临时表空间的,在oracle中指定默认临时表空间不是必选项。但是强烈建议新建用户一定要指定临时表空间。这是因为因为如果不指定临时表空间的话一旦pga中的排序区域写满的话,此时系统在没有指定临时表空间的话,它会自动将SYSTEM表空间当成临时表空间来存储临时数据,我们都知道SYSTEM表空间是不存数据的,且里面记载了一些系统运行的相关数据称之为数据字典,由于临时表空间的数据都是临时的,所以数据库系统需要频繁地去分配和释放临时段来存储和释放临时数据,这时候就会导致系统表空间会产生很多的存储碎片,影响系统读取硬盘的效率,且SYSTEM表空间大小是有限的,如果用了系统表空间会占用相当大的空间。

指定默认临时表空间用default temporary tablespace tablespace_name


完善方案

1、可以将临时表空间存放于一个独立的分区,这样可以防止临时表空间为了创建临时文件而空间不足的错误。也方便DBA对临时表空间产生的存储碎片进行整理。

2、临时表空间组(temporary tablespace groups)

今天做的主要测试就是临时表空间组,这个从oracle10g以后便有的特性,解决了有些临时表空间频繁被使用而有些临时表空间却很空闲的问题。

概念:一个临时表空间组可以由多个临时表空间组成(最少一个),最多不受限制,但组内的临时表空间名不能与组名相同。

临时表空间是创建临时表空间的时候指定group便会自己创建,我们可以把组内的临时表空间转移到其他的组也可以删除组内的临时表空间,当我们把一个组内的临时表空间都删除的话,那么这个组也就消失了,但我发现其实他还是存在的,只要你把另外组内临时表空间再移到那个消失的组名,消失的组就又回来了。

下面是简单的操作

创建2组临时表空间组并查询表空间组



把临时表空间t1更改组到group2查询结果后改回



删除表空间t1包括内容和数据文件,查询发现t1所在的组group1消失,但吧t2转移到消失的group1时,group1又出现


使用临时表空间组的优点

1、数据库层面可以同时指定多个临时表空间,避免当临时表空间不足时引起的磁盘排序问题;

2、当一个用户同时有多个会话时,可以使得他们使用不同的临时表空间;

3、并行操作中,不同的从属进程可以使用不同的临时表空间

### Oracle CREATE USER 命令解析 #### 1. DEFAULT TABLESPACE `DEFAULT TABLESPACE` 是 `CREATE USER` 命令中的一个子句,用于指定新创建的用户默认使用的表空间。如果没有显式指定,默认会使用数据库的 `USERS` 表空间作为默认表空间[^5]。 示例代码: ```sql CREATE USER myuser IDENTIFIED BY password DEFAULT TABLESPACE users; ``` 上述命令中,`myuser` 的默认表空间被设置为 `users` 表空间。 #### 2. TEMPORARY TABLESPACE `TEMPORARY TABLESPACE` 子句用于定义用户在执行排序、哈希连接等操作时使用的临时表空间。如果未指定,系统将使用数据库的默认临时表空间。 示例代码: ```sql CREATE USER myuser IDENTIFIED BY password TEMPORARY TABLESPACE temp; ``` 在此示例中,`myuser` 的临时表空间被设置为 `temp`。 #### 3. QUOTA `QUOTA` 子句用于限制用户在其默认表空间或指定表空间中的磁盘配额。通过 `QUOTA`,可以控制用户占用的存储空间大小,防止某个用户过度消耗表空间资源[^1]。 - **QUOTA [size] ON tablespace_name**:允许用户在指定表空间中使用一定量的空间。 - **QUOTA UNLIMITED ON tablespace_name**:允许用户在指定表空间中使用无限量的空间。 示例代码: ```sql CREATE USER myuser IDENTIFIED BY password QUOTA 100M ON users; ``` 此命令限制 `myuser` 在 `users` 表空间中最多使用 100MB 的空间。 如果需要取消配额限制,可以使用以下命令: ```sql ALTER USER myuser QUOTA UNLIMITED ON users; ``` #### 4. UNLIMITED TABLESPACE 权限 当用户被授予 `UNLIMITED TABLESPACE` 系统权限时,即使未显式设置 `QUOTA`,该用户也可以在所有表空间中使用无限量的空间[^4]。 示例代码: ```sql GRANT UNLIMITED TABLESPACE TO myuser; ``` 需要注意的是,`UNLIMITED TABLESPACE` 权限可能会导致表空间资源被过度消耗,因此应谨慎授予此权限。 #### 注意事项 - 如果用户在其默认表空间中超出配额限制,将无法创建新对象,并会收到类似 `ORA-01536: space quota exceeded for tablespace` 的错误消息[^1]。 - 使用 `DROP TABLE` 或 `DELETE` 操作时,表空间中的实际磁盘空间可能不会立即释放,这可能导致表空间资源耗尽[^2]。 ### 示例完整代码 以下是一个完整的 `CREATE USER` 命令示例: ```sql CREATE USER myuser IDENTIFIED BY password DEFAULT TABLESPACE users TEMPORARY TABLESPACE temp QUOTA 100M ON users; GRANT CREATE SESSION TO myuser; ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值