Oracle 临时表空间SQL语句的实现


Posted in Oracle onSeptember 25, 2021

临时表空间概念

临时表空间用来管理数据库排序操作以及用于存储临时表、中间排序结果等临时对象,当ORACLE里需要用到SORT的时候,并且当PGA中sort_area_size大小不够时,将会把数据放入临时表空间里进行排序。像数据库中一些操作: CREATE INDEX、 ANALYZE、SELECT DISTINCT、ORDER BY、GROUP BY、 UNION ALL、 INTERSECT、MINUS、SORT-MERGE JOINS、HASH JOIN等都可能会用到临时表空间。当操作完成后,系统会自动清理临时表空间中的临时对象,自动释放临时段。这里的释放只是标记为空闲、可以重用,其实实质占用的磁盘空间并没有真正释放。这也是临时表空间有时会不断增大的原因。

临时表空间存储大规模排序操作(小规模排序操作会直接在RAM里完成,大规模排序才需要磁盘排序Disk Sort)和散列操作的中间结果.它跟永久表空间不同的地方在于它由临时数据文件(temporary files)组成的,而不是永久数据文件(datafiles)。临时表空间不会存储永久类型的对象,所以它不会也不需要备份。另外,对临时数据文件的操作不产生redo日志,不过会生成undo日志。

创建临时表空间或临时表空间添加临时数据文件时,即使临时数据文件很大,添加过程也相当快。这是因为ORACLE的临时数据文件是一类特殊的数据文件:稀疏文件(Sparse File),当临时表空间文件创建时,它只会写入文件头部和最后块信息(only writes to the header and last block of the file)。它的空间是延后分配的.这就是你创建临时表空间或给临时表空间添加数据文件飞快的原因。

另外,临时表空间是NOLOGGING模式以及它不保存永久类型对象,因此即使数据库损毁,做Recovery也不需要恢复Temporary Tablespace。

以下总结了关于 Oracle 数据库临时表空间的相关 SQL 语句:

Oracle 临时表空间创建和添加数据文件:

--创建临时表空间 tempdata
create temporary tablespace tempdata tempfile '/oradata/orcl/tempdata01.dbf' size 30g autoextend off;
--新增临时表空间数据文件
alter tablespace tempdata add tempfile '/oradata/orcl/tempdata02.dbf' size 30g autoextend off;
--删除临时表空间数据文件
alter tablespace tempdata drop tempfile '/oradata/orcl/tempdata02.dbf' including datafiles;
--调整临时表空间数据文件大小
alter database tempfile '/oradata/orcl/tempdata01.dbf' resize 2G;
--设置自动扩展
alter database tempfile '/oradata/orcl/tempdata01.dbf' autoextend on;
--切换默认临时表空间
alter database default temporary tablespace tempdata;
--删除临时表空间
drop tablespace temp including contents and datafiles cascade constraints;
--收缩临时表空间
alter tablespace temp shrink space keep 8G;
alter tablespace temp shrink tempfile '/oradata/orcl/tempdata01.dbf';

查看当前默认临时表空间:

SELECT PROPERTY_NAME, PROPERTY_VALUE FROM DATABASE_PROPERTIES WHERE PROPERTY_NAME='DEFAULT_TEMP_TABLESPACE';

查询temp表空间使用率:

select  df.tablespace_name "Tablespace",
       df.totalspace "Total(MB)",
       nvl(FS.UsedSpace, 0)  "Used(MB)",
       (df.totalspace - nvl(FS.UsedSpace, 0)) "Free(MB)",
       round(100 * (1-( nvl(fs.UsedSpace, 0) / df.totalspace)), 2) "Pct. Free(%)"
FROM  (SELECT tablespace_name, round(SUM(bytes) / 1048576) TotalSpace
        FROM   dba_TEMP_files
        GROUP  BY tablespace_name) df,
       (SELECT tablespace_name, ROUND(SUM(bytes_used) / 1024 / 1024)  UsedSpace
        FROM   gV$temp_extent_pool
        GROUP  BY tablespace_name) fs  WHERE  df.tablespace_name = fs.tablespace_name(+)

查看临时表空间对应的临时文件的使用情况:

SELECT TABLESPACE_NAME         AS TABLESPACE_NAME    ,
    BYTES_USED/1024/1024/1024    AS TABLESAPCE_USED  ,
    BYTES_FREE/1024/1024/1024  AS TABLESAPCE_FREE
FROM V$TEMP_SPACE_HEADER
ORDER BY 1 DESC;

查询实时使用temp表空间的sql_id和sid:

set linesize 260 pagesize 1000
col machine for a40
col program for a40
SELECT se.username,
       sid,
       serial#,
       se.sql_id
       machine,
       program,
       tablespace,
       segtype,
       (su.BLOCKS*8/1024/1024) GB
  FROM v$session se, v$sort_usage su
 WHERE se.saddr = su.session_addr
 order by su.BLOCKS desc;

 
/*需要注意的是这里查询sql_id要用v$session视图的sql_id,而不要用v$sort_usage视图的sql_id,v$sort_usage视图里面的sql_id是不准确的*/

查询历史的temp表空间的使用的SQL_ID:

select a.SQL_ID,
       a.SAMPLE_TIME,
       a.program,
       sum(trunc(a.TEMP_SPACE_ALLOCATED / 1024 / 1024)) MB
  from v$active_session_history a
 where TEMP_SPACE_ALLOCATED is not null 
 and sample_time between
 to_date('&date1', 'yyyy-mm-dd hh24:mi:ss') and
 to_date('&date2', 'yyyy-mm-dd hh24:mi:ss')
 group by a.sql_id,a.SAMPLE_TIME,a.PROGRAM
 order by 2 asc,4 desc;

到此这篇关于Oracle 临时表空间SQL语句的实现的文章就介绍到这了,更多相关Oracle 临时表空间语句内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Oracle 相关文章推荐
Oracle笔记
Apr 05 Oracle
使用Oracle跟踪文件的问题详解
Jun 28 Oracle
Oracle以逗号分隔的字符串拆分为多行数据实例详解
Jul 16 Oracle
oracle连接ODBC sqlserver数据源的详细步骤
Jul 25 Oracle
Oracle安装TNS_ADMIN环境变量设置参考
Nov 01 Oracle
使用Oracle命令进行数据库备份与还原
Dec 06 Oracle
在Oracle表中进行关键词搜索的过程
Jun 10 Oracle
Oracle 11g数据库使用expdp每周进行数据备份并上传到备份服务器
Jun 28 Oracle
Oracle删除归档日志及添加定时任务
Jun 28 Oracle
Oracle查看表空间使用率以及爆满解决方案详解
Jul 23 Oracle
oracle索引总结
Sep 25 #Oracle
Oracle 死锁的检测查询及处理
Sep 25 #Oracle
RPM包方式安装Oracle21c的方法详解
oracle连接ODBC sqlserver数据源的详细步骤
Oracle以逗号分隔的字符串拆分为多行数据实例详解
快速学习Oracle触发器和游标
使用Oracle跟踪文件的问题详解
You might like
php对二维数组按指定键值key排序示例代码
2013/11/26 PHP
PHP图片等比例缩放生成缩略图函数分享
2014/06/10 PHP
php判断对象是派生自哪个类的方法
2015/06/20 PHP
浅谈Laravel队列实现原理解决问题记录
2017/08/19 PHP
如何在centos8自定义目录安装php7.3
2019/11/28 PHP
JQuery下关于$.Ready()的分析
2009/12/13 Javascript
JavaScript 原型学习总结
2010/10/29 Javascript
JQuery入门——事件切换之toggle()方法应用介绍
2013/02/05 Javascript
js获取键盘按键响应事件(兼容各浏览器)
2013/05/16 Javascript
跨域资源共享 CORS 详解
2016/04/26 Javascript
Vue.js基础知识小结
2017/01/13 Javascript
javascript 动态生成css代码的两种方法
2017/03/17 Javascript
基于JavaScript实现验证码功能
2017/04/01 Javascript
nodejs+mongodb+vue前后台配置ueditor的示例代码
2018/01/02 NodeJs
JavaScript设计模式之工厂模式简单实例教程
2018/07/03 Javascript
jQuery选择器选中最后一个元素,倒数第二个元素操作示例
2018/12/10 jQuery
django js 实现表格动态标序号的实例代码
2019/07/12 Javascript
解决layer弹出层中表单不起作用的问题
2019/09/09 Javascript
一篇文章带你使用Typescript封装一个Vue组件(简单易懂)
2020/06/05 Javascript
jQuery实现雪花飘落效果
2020/08/02 jQuery
[36:20]完美世界DOTA2联赛PWL S3 access vs Rebirth 第一场 12.17
2020/12/18 DOTA
Python实现的从右到左字符串替换方法示例
2018/07/06 Python
python的pygal模块绘制反正切函数图像方法
2019/07/16 Python
Pycharm安装并配置jupyter notebook的实现
2020/05/18 Python
利用keras使用神经网络预测销量操作
2020/07/07 Python
Python抖音快手代码舞(字符舞)的实现方法
2021/02/07 Python
HTML5中的nav标签学习笔记
2016/06/24 HTML / CSS
中兴通讯全球官方网站:ZTE
2020/12/26 全球购物
介绍一下UNIX启动过程
2013/11/14 面试题
八年级历史教学反思
2014/01/10 职场文书
2015公务员试用期工作总结
2014/12/12 职场文书
医院感染管理制度
2015/08/05 职场文书
详解CSS不定宽溢出文本适配滚动
2021/05/24 HTML / CSS
Python初学者必备的文件读写指南
2021/06/23 Python
Redis高并发防止秒杀超卖实战源码解决方案
2021/11/01 Redis
Spring this调用当前类方法无法拦截的示例代码
2022/03/20 Java/Android