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 数据仓库ETL技术之多表插入语句的示例详解
Apr 12 Oracle
Oracle11g R2 安装教程完整版
Jun 04 Oracle
Oracle创建只读账号的详细步骤
Jun 07 Oracle
ORACLE数据库应用开发的三十个注意事项
Jun 07 Oracle
Oracle以逗号分隔的字符串拆分为多行数据实例详解
Jul 16 Oracle
关于Oracle12C默认用户名system密码不正确的解决方案
Oct 16 Oracle
Oracle数据库中通用的函数实例详解
Mar 25 Oracle
Oracle中DBLink的详细介绍
Apr 29 Oracle
解决Oracle数据库用户密码过期
May 11 Oracle
在Oracle表中进行关键词搜索的过程
Jun 10 Oracle
Oracle数据库事务的开启与结束详解
Jun 25 Oracle
Oracle删除归档日志及添加定时任务
Jun 28 Oracle
oracle索引总结
Sep 25 #Oracle
Oracle 死锁的检测查询及处理
Sep 25 #Oracle
RPM包方式安装Oracle21c的方法详解
oracle连接ODBC sqlserver数据源的详细步骤
Oracle以逗号分隔的字符串拆分为多行数据实例详解
快速学习Oracle触发器和游标
使用Oracle跟踪文件的问题详解
You might like
又一个PHP实现的冒泡排序算法分享
2014/08/21 PHP
php 输出json及显示json中的中文汉字详解及实例
2016/11/09 PHP
Laravel框架实现调用百度翻译API功能示例
2019/05/30 PHP
JavaScript 精粹读书笔记(1,2)
2010/02/07 Javascript
JQuery+JS实现仿百度搜索结果中关键字变色效果
2011/08/02 Javascript
jquery连缀语法如何实现
2012/11/29 Javascript
jQuery setTimeout()函数使用方法
2013/04/07 Javascript
jQuery实现表格行上下移动和置顶效果
2015/06/05 Javascript
实例详解jQuery表单验证插件validate
2016/01/18 Javascript
全面解析Bootstrap中tab(选项卡)的使用方法
2016/06/06 Javascript
ECMAScript6--解构
2017/03/30 Javascript
父组件中vuex方法更新state子组件不能及时更新并渲染的完美解决方法
2018/04/25 Javascript
教你如何用node连接redis的示例代码
2018/07/12 Javascript
vue 项目地址去掉 #的方法
2018/10/20 Javascript
微信小程序swiper实现滑动放大缩小效果
2018/11/15 Javascript
TypeScript开发Node.js程序的方法
2019/04/30 Javascript
浅析微信小程序modal弹窗关闭默认会执行cancel问题
2019/10/14 Javascript
Vue filter 过滤器、以及在table中的使用介绍
2020/09/07 Javascript
下载安装setuptool和pip linux安装pip    
2014/01/24 Python
Python中让MySQL查询结果返回字典类型的方法
2014/08/22 Python
Python中isnumeric()方法的使用简介
2015/05/19 Python
Python实现HTTP协议下的文件下载方法总结
2016/04/20 Python
python去除空格和换行符的实现方法(推荐)
2017/01/04 Python
快速解决pyqt5窗体关闭后子线程不同时退出的问题
2019/06/19 Python
python3.7将代码打包成exe程序并添加图标的方法
2019/10/11 Python
opencv-python 读取图像并转换颜色空间实例
2019/12/09 Python
python+selenium 脚本实现每天自动登记的思路详解
2020/03/11 Python
详解基于Jupyter notebooks采用sklearn库实现多元回归方程编程
2020/03/25 Python
Python tkinter界面实现历史天气查询的示例代码
2020/08/23 Python
纯css实现照片墙3D效果的示例代码
2017/11/13 HTML / CSS
越南电子产品购物网站:FPT Shop
2017/12/02 全球购物
保加利亚服装和鞋类购物网站:Bibloo.bg
2020/11/08 全球购物
中学总务处工作总结
2015/08/12 职场文书
养成教育主题班会
2015/08/13 职场文书
MySQL 逻辑备份与恢复测试的相关总结
2021/05/14 MySQL
js 实现Material UI点击涟漪效果示例
2022/09/23 Javascript