如何查看临时表空间的使用情况

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何查看临时表空间的使用情况相关的知识,希望对你有一定的参考价值。

参考技术A 1. 查看所有表空间大小

SQL> select tablespace_name,sum(bytes)/1024/1024 from dba_data_files
2 group by tablespace_name;

2. 已经使用的表空间大小
SQL> select tablespace_name,sum(bytes)/1024/1024 from dba_free_space
2 group by tablespace_name;

3. 所以使用空间可以这样计算

select a.tablespace_name,total,free,total-free used from
( select tablespace_name,sum(bytes)/1024/1024 total from dba_data_files
group by tablespace_name) a,
( select tablespace_name,sum(bytes)/1024/1024 free from dba_free_space
group by tablespace_name) b
where a.tablespace_name=b.tablespace_name;

4. 下面这条语句查看所有segment的大小。
Select Segment_Name,Sum(bytes)/1024/1024 From User_Extents Group By Segment_Name

5. 还有在命令行情况下如何将结果放到一个文件里。
SQL> spool out.txt
SQL> select * from v$database;
SQL> spool off本回答被提问者和网友采纳
参考技术B

先来说说临时表的概念。 临时表顾名思义,就是临时的,用完销毁掉的表。 数据既可以保存在临时的文件系统上,也可以保存在固定的磁盘文件系统上。 临时表有下面几种:


1全局临时表

这种临时表从数据库实例启动后开始生效,在数据库实例销毁后失效。在mysql里面这种临时表对应的是内存表,即memory引擎。


2会话级别临时表

这种临时表在用户登录系统成功后生效,在用户退出时失效。在MySQL里的临时表指的就是以 create temporary table 这样的关键词创建的表。


3事务级别临时表

这种临时表在事务开始时生效,事务提交或者回滚后失效。 在MySQL里面没有这种临时表,必须利用会话级别的临时表间接实现。


4检索级别临时表

这种临时表在SQL语句执行之间产生,执行完毕后失效。 在MySQL里面这种临时表不是很固定,跟随MySQL默认存储引擎来变化。比如默认存储引擎是MyISAM,临时表的引擎就是MyISAM,并且文件生成形式以及数据运作形式和MyISAM一样,只是数据保存在内存里;如果默认引擎是INNODB,那么临时表的引擎就是INNODB,此时它的所有信息都保存在共享表空间ibdata里面。


MySQL 5.7对于InnoDB存储引擎的临时表空间做了优化。在MySQL 5.7之前,INNODB引擎的临时表都保存在ibdata里面,而ibdata的贪婪式磁盘占用导致临时表的创建与删除对其他正常表产生非常大的性能影响。在MySQL5.7中,对于临时表做了下面两个重要方面的优化:


    MySQL5.7 把临时表的数据以及回滚信息(仅限于未压缩表)从共享表空间里面剥离出来,形成自己单独的表空间,参数为innodb_temp_data_file_path。

    在MySQL5.7 中把临时表的相关检索信息保存在系统信息表中:information_schema.innodb_temp_table_info. 而MySQL 5.7之前的版本想要查看临时表的系统信息是没有太好的办法。

    需要注意的一点就是,虽然INNODB临时表有自己的表空间,但是目前还不能自己定义临时表空间文件的保存路径,只能是继承innodb_data_home_dir。此时如果想要拿其他的磁盘,比如内存盘来充当临时表空间的保存地址,只能用老办法,做软链。举个小例子:

    我现在用的OS是 Ubuntu12.X,想用tmpfs文件系统充当临时表空间,

    root@ytt-master-VirtualBox:/usr/local/mysql/data# ln -s/run/shm/ /usr/local/mysql/data/tmp_space2

    root@ytt-master-VirtualBox:/usr/local/mysql/data#ls -l | grep 'shm'

    lrwxrwxrwx1 root root 9 Nov 13 10:28tmp_space2 -> /run/shm/

    然后把

    innodb_temp_data_file_path=tmp_space2/ibtmp2:200M:autoextend

    添加到my.cnf里的[mysqld]下面一行

    重启MySQL服务后,

    mysql>select @@innodb_temp_data_file_path\\G

    ***************************1. row ***************************

    @@innodb_temp_data_file_path:tmp_space2/ibtmp2:200M:autoextend

    1 rowin set (0.00 sec)

    先写一个批量创建临时表的存储过程:

    DELIMITER$$

    USE`t_girl`$$

    DROPPROCEDURE IF EXISTS `sp_create_temporary_table`$$

    CREATEDEFINER=`root`@`localhost` PROCEDURE `sp_create_temporary_table`(

    IN f_cnt INT UNSIGNED )

    BEGIN

    DECLARE i INT UNSIGNED DEFAULT 1;

    WHILE i <= f_cnt

    DO

    SET @stmt = CONCAT('create temporarytable tmp',i,' ( id int, tmp_desc varchar(60));');

    PREPARE s1 FROM @stmt;

    EXECUTE s1;

    SET i = i + 1;

    END WHILE;

    DROP PREPARE s1;

    END$$

    DELIMITER;

    现在来创建10张临时表:

    mysql>call sp_create_temporary_table(10);

    QueryOK, 0 rows affected (0.07 sec)

    如果在以前,我们只知道创建了10张临时表,但是只能凭记忆或者手工记录下来临时表的名字等信息。

    现在可以直接从数据字典里面检索相关数据。

    mysql> select * frominformation_schema.innodb_temp_table_info;

    +----------+--------------+--------+-------+----------------------+---------------+

    |TABLE_ID | NAME | N_COLS | SPACE| PER_TABLE_TABLESPACE | IS_COMPRESSED |

    +----------+--------------+--------+-------+----------------------+---------------+

    | 56 | #sql1705_2_9 | 5 | 36 | FALSE | FALSE |

    | 55 | #sql1705_2_8 | 5 | 36 | FALSE |FALSE |

    | 54 | #sql1705_2_7 | 5 | 36 | FALSE | FALSE |

    | 53 | #sql1705_2_6 | 5 | 36 | FALSE | FALSE |

    | 52 | #sql1705_2_5 | 5 | 36 | FALSE |FALSE |

    | 51 | #sql1705_2_4 | 5 | 36 | FALSE | FALSE |

    | 50 | #sql1705_2_3 | 5 | 36 | FALSE | FALSE |

    | 49 | #sql1705_2_2 | 5 | 36 | FALSE |FALSE |

    | 48 | #sql1705_2_1 | 5 | 36 | FALSE | FALSE |

    | 47 | #sql1705_2_0 | 5 | 36 | FALSE | FALSE |

    +----------+--------------+--------+-------+----------------------+---------------+

    10rows in set (0.00 sec)

    功能性我就写到这里,大家性能方面如果有兴趣可以找时间去测试。

如何查询oracle表空间使用情况

    查询表空间剩余容量

    select tablespace_name,sum(bytes)/1024/1024  from dba_free_space group by tablespace_name;

    查询表空间总大小

    select tablespace_name,sum(bytes)/1024/1024 from dba_data_files group by tablespace_name;

参考技术A //查看表空间剩余空间(M)
select tablespace_name,sum(bytes)/1024/1024 free_space
from dba_free_space
group by tablespace_name;
//详细查看表空间使用状况,包括总大小,使用空间,使用率,剩余空间
select t.*
from (SELECT D.TABLESPACE_NAME,
SPACE "SUM_SPACE(M)",
BLOCKS SUM_BLOCKS,
SPACE - NVL(FREE_SPACE, 0) "USED_SPACE(M)",
ROUND((1 - NVL(FREE_SPACE, 0) / SPACE) * 100, 2) "USED_RATE(%)",
FREE_SPACE "FREE_SPACE(M)"
FROM (SELECT TABLESPACE_NAME,
ROUND(SUM(BYTES) / (1024 * 1024), 2) SPACE,
SUM(BLOCKS) BLOCKS
FROM DBA_DATA_FILES
GROUP BY TABLESPACE_NAME) D,
(SELECT TABLESPACE_NAME,
ROUND(SUM(BYTES) / (1024 * 1024), 2) FREE_SPACE
FROM DBA_FREE_SPACE
GROUP BY TABLESPACE_NAME) F
WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME(+)
UNION ALL --if have tempfile
SELECT D.TABLESPACE_NAME,
SPACE "SUM_SPACE(M)",
BLOCKS SUM_BLOCKS,
USED_SPACE "USED_SPACE(M)",
ROUND(NVL(USED_SPACE, 0) / SPACE * 100, 2) "USED_RATE(%)",
SPACE - USED_SPACE "FREE_SPACE(M)"
FROM (SELECT TABLESPACE_NAME,
ROUND(SUM(BYTES) / (1024 * 1024), 2) SPACE,
SUM(BLOCKS) BLOCKS
FROM DBA_TEMP_FILES
GROUP BY TABLESPACE_NAME) D,
(SELECT TABLESPACE,
ROUND(SUM(BLOCKS * 8192) / (1024 * 1024), 2) USED_SPACE
FROM V$SORT_USAGE
GROUP BY TABLESPACE) F
WHERE D.TABLESPACE_NAME = F.TABLESPACE(+)) t
order by "USED_RATE(%)" desc;
SELECT tablespace_name, sum ( blocks ) as free_blk , trunc ( sum ( bytes ) / (1024*1024) ) as free_m, max ( bytes ) / (1024) as big_chunk_k, count (*) as num_chunks
FROM dba_free_space
GROUP BY tablespace_name;

以上是关于如何查看临时表空间的使用情况的主要内容,如果未能解决你的问题,请参考以下文章

如何查看oracle临时表空间当前使用了多少空间的大小

如何查看临时表空间的大小和剩余空间

查看临时表空间

oracle 数据库怎么查看temp表空间使用情况

ORA-1652:临时表空间异常优化处理

ORA-25153临时表空间为空