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

 更新时间:2021年09月24日 10:50:43   作者:Lucifer三思而后行  
临时表空间用来管理数据库排序操作以及用于存储临时表、中间排序结果等临时对象,本文主要介绍了Oracle 临时表空间SQL语句的实现,感兴趣的可以了解一下

临时表空间概念

临时表空间用来管理数据库排序操作以及用于存储临时表、中间排序结果等临时对象,当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数据库优化策略总结篇

    本文介绍了一些很实用但却不是很常见的Oracle数据库的优化策略,包括批量FETCH、SQL预解析等,需要的朋友可以参考下
    2015-08-08
  • 处理Oracle监听程序当前无法识别连接描述符中请求的服务异常(ORA-12514)

    处理Oracle监听程序当前无法识别连接描述符中请求的服务异常(ORA-12514)

    这篇文章介绍了处理Oracle监听程序当前无法识别连接描述符中请求的服务异常(ORA-12514),对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-12-12
  • 快速解除oracle dataguard的方法

    快速解除oracle dataguard的方法

    文章介绍了如何快速解除Oracle Data Guard配置的过程,包括备份SPFILE到PFILE、调整主库模式、修改主库DG配置参数、删除Standby Log以及重启数据库等步骤,感兴趣的朋友一起看看吧
    2025-03-03
  • Oracle实现细粒度访问控制的步骤

    Oracle实现细粒度访问控制的步骤

    细粒度访问控制是Oracle数据库中用于提供行级和列级安全控制的强大功能,本文主要给大家介绍了Oracle实现细粒度访问控制的步骤,并通过代码示例讲解的非常详细,需要的朋友可以参考下
    2024-09-09
  • Oracle中实现行列互转的方法分享

    Oracle中实现行列互转的方法分享

    这篇文章主要为大家总结了Oracle中实现行列互转的简单方法,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-06-06
  • Oracle 11g+windows 环境下Ecology7系统安装过程

    Oracle 11g+windows 环境下Ecology7系统安装过程

    这篇文章主要介绍了Oracle 11g+windows 环境下Ecology7系统安装,安装步骤是以管理员模式运行Oracle setup.exe文件,根据提示安装Oracle,创建数据库,注意修改连接数,本文给大家详细讲解,需要的朋友可以参考下
    2022-10-10
  • Oracle In和exists not in和not exists的比较分析

    Oracle In和exists not in和not exists的比较分析

    一个是问in exist的区别,一个是not in和not exists的区别
    2009-08-08
  • Oracle的RBO和CBO详细介绍和优化模式设置方法

    Oracle的RBO和CBO详细介绍和优化模式设置方法

    这篇文章主要介绍了Oracle的RBO和CBO详细介绍和优化模式设置方法,RBO即基于规则的优化方式(Rule-Based Optimization),CBO即基于代价的优化方式(Cost-Based Optimization),需要的朋友可以参考下
    2014-07-07
  • Oracle 10g利用amdu抽取数据文件的方法教程

    Oracle 10g利用amdu抽取数据文件的方法教程

    这篇文章主要给大家介绍了关于Oracle 10g利用amdu抽取数据文件的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-12-12
  • oracle 数据库连接分析

    oracle 数据库连接分析

    oracle 数据库连接个各种环境分析,让大家较快的解决一些数据库连接问题。
    2009-07-07

最新评论