对于某些 UNION 语句,不能合并的 VIEW,子查询时用到派生表,多表 UPDATE 以及其他一些情况,还需要使用临时表。如果临时表很小,可以到内存中创建,否则它将在磁盘上创建。MySQL 在内存中创建了一个表,如果它变得太大,就会被转换为磁盘上存储。内存临时表的最大值由 tmp_table_size 或 max_heap_table_size 值定义,以较小者为准。MySQL 5.7 中的默认大小为 16MB。如果运行查询的数据量较大,或者尚未查询优化,则可以增加该值。设置阈值时,请考虑可用的 RAM 大小以及峰值期间的并发连接数。你无法无限期地增加变量,因为在某些时候你需要让 MySQL 使用磁盘上的临时表。
注意:如果涉及的表具有 TEXT 或 BLOB 列,则即使大小小于配置的阈值,也会在磁盘上创建临时表。
深度解析MySQL 5.7之临时表空间作者:杨涛涛
尽管临时表在实际在线场景中很少会去显式使用,但在某些运维场景还是需要到的,在MySQL5.7中,专门针对临时表做了些优化,下面这篇文章我们来一起深入的解析MySQL 5.7之临时表空间,有需要的朋友们可以参考借鉴,下面来一起看看吧。
临时表
临时表顾名思义,就是临时的,用完销毁掉的表。 数据既可以保存在临时的文件系统上,也可以保存在固定的磁盘文件系统上。
临时表有下面几种:
1、全局临时表
这种临时表从数据库实例启动后开始生效,在数据库实例销毁后失效。在MySQL里面这种临时表对应的是内存表,即memory引擎。
2、会话级别临时表
这种临时表在用户登录系统成功后生效,在用户退出时失效。在MySQL里的临时表指的就是以create temporary table这样的关键词创建的表。
3、事务级别临时表
这种临时表在事务开始时生效,事务提交或者回滚后失效。 在MySQL里面没有这种临时表,必须利用会话级别的临时表间接实现。
4、检索级别临时表
这种临时表在SQL语句执行之间产生,执行完毕后失效。 在MySQL里面这种临时表不是很固定,跟随MySQL默认存储引擎来变化。比如默认存储引擎是MyISAM,临时表的引擎就是MyISAM,并且文件生成形式以及数据运作形式和MyISAM一样,只是数据保存在内存里;如果默认引擎是INNODB,那么临时表的引擎就是INNODB,此时它的所有信息都保存在共享表空间ibdata里面。
MySQL 5.7之临时表空间
MySQL 5.7对于InnoDB存储引擎的临时表空间做了优化。在MySQL 5.7之前,INNODB引擎的临时表都保存在ibdata里面,而ibdata的贪婪式磁盘占用导致临时表的创建与删除对其他正常表产生非常大的性能影响。在MySQL5.7中,对于临时表做了下面两个重要方面的优化:
1、MySQL 5.7 把临时表的数据以及回滚信息(仅限于未压缩表)从共享表空间里面剥离出来,形成自己单独的表空间,参数为innodb_temp_data_file_path。
2
1、查看临时表空间 (dba_temp_files视图)(v_$tempfile视图)select tablespace_name,file_name,bytes/1024/1024 file_size,autoextensible from dba_temp_filesselect status,enabled, name, bytes/1024/1024 file_size from v_$tempfile--sys用户查看2、缩小临时表空间大小alter database tempfile 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\TELEMT\TEMP01.DBF' resize 100M3、扩展临时表空间:方法一、增大临时文件大小:SQL>alter database tempfile ‘/u01/app/oracle/oradata/orcl/temp01.dbf’ resize 100m方法二、将临时数据文件设为自动扩展:SQL>alter database tempfile ‘/u01/app/oracle/oradata/orcl/temp01.dbf’ autoextend on next 5m maxsize unlimited方法三、向临时表空间中添加数据文件:SQL>alter tablespace temp add tempfile ‘/u01/app/oracle/oradata/orcl/temp02.dbf’ size 100m4、创建临时表空间:SQL>create temporary tablespace temp1 tempfile ‘/u01/app/oracle/oradata/orcl/temp11.dbf’ size 10M5、更改系统的默认临时表空间:--查询默认临时表空间select * from database_properties where property_name='DEFAULT_TEMP_TABLESPACE'--修改默认临时表空间alter database default temporary tablespace temp1所有用户的默认临时表空间都将切换为新的临时表空间:select username,temporary_tablespace,default_ from dba_users--更改某一用户的临时表空间:alter user scott temporary tablespace temp6、删除临时表空间删除临时表空间的一个数据文件:SQL>alter database tempfile ‘/u01/app/oracle/oradata/orcl/temp02.dbf’ drop删除临时表空间(彻底删除):SQL>drop tablespace temp1 including contents and datafiles cascade constraints7、查看临时表空间的使用情况(GV_$TEMP_SPACE_HEADER视图必须在sys用户下才能查询)GV_$TEMP_SPACE_HEADER视图记录了临时表空间的使用大小与未使用的大小dba_temp_files视图的bytes字段记录的是临时表空间的总大小SELECT temp_used.tablespace_name,total - used as "Free",total as "Total",round(nvl(total - used, 0) * 100 / total, 3) "Free percent"FROM (SELECT tablespace_name, SUM(bytes_used) / 1024 / 1024 usedFROM GV_$TEMP_SPACE_HEADER GROUP BY tablespace_name) temp_used,(SELECT tablespace_name, SUM(bytes) / 1024 / 1024 totalFROM dba_temp_filesGROUP BY tablespace_name) temp_totalWHERE temp_used.tablespace_name = temp_total.tablespace_nameORDER BY B.TABLESPACE, B.SEGFILE#, B.SEGBLK#, B.BLOCKS欢迎分享,转载请注明来源:内存溢出
评论列表(0条)