数据库临时表,在数据库中临时表什么时候会被清除呢
大家好,今天来为大家分享数据库临时表的一些知识点,和在数据库中临时表什么时候会被清除呢的问题解析,大家要是都明白,那么可以忽略,如果不太清楚的话可以看看本篇文章,相信很大概率可以解决您的问题,接下来我们就一起来看看吧!
SQL临时表使用
1、创建方法:
方法一:
create table TempTableName
或
select [字段1,字段2,...,] into TempTableName from table
方法二:
create table tempdb.MyTempTable(Tid int)
说明:
(1)、临时表其实是放在数据库tempdb里的一个用户表;
(2)、TempTableName必须带“#”,“#"可以是一个或者两个,以#(局部)或##(全局)开头的表,这种表在会话期间存在,会话结束则自动删除;
(3)、如果创建时不以#或##开头,而用tempdb.TempTable来命名它,则该表可在数据库重启前一直存在。
2、手动删除
drop table TempTableName
说明:
DROP TABLE语句显式除去临时表,否则临时表将在退出其作用域时由系统自动除去:
(1)、当存储过程完成时,将自动除去在存储过程中创建的本地临时表。由创建表的存储过程执行的所有嵌套存储过程都可以引用此表。但调用创建此表的存储过程的进程无法引用此表;
(2)、所有其它本地临时表在当前会话结束时自动除去;
(3)、全局临时表在创建此表的会话结束且其它任务停止对其引用时自动除去。任务与表之间的关联只在单个Transact-SQL语句的生存周期内保持。换言之,当创建全局临时表的会话结束时,最后一条引用此表的Transact-SQL语句完成后,将自动除去此表。
在数据库中临时表什么时候会被清除呢
我们仍使用实验 05中的环境,略去准备数据的过程。
我们仍然使用两个会话,一个会话 run,用于运行主 SQL;另一个会话 ps,用于进行 performance_schema的观察:
主会话线程号为 29,
将 performance_schema中的统计量重置,
临时表的表大小限制取决于参数 tmp_table_size和 max_heap_table_size中较小者,我们实验中以设置 max_heap_table_size为例。
我们将会话级别的临时表大小设置为 2M(小于上次实验中临时表使用的空间),执行使用临时表的 SQL:
查看内存的分配记录:
会发现内存分配略大于 2M,我们猜测临时表会比配置略多一点消耗,可以忽略。
查看语句的特征值:
可以看到语句使用了一次需要落磁盘的临时表。
那么这张临时表用了多少的磁盘呢?
我们开启 performance_schema中 waits相关的统计项:
重做实验,略过。
再查看 performance_schema的统计值:
可以看到几个现象:
1.临时表空间被写入了 7.92MiB的数据。
2.这些数据是语句写入后,慢慢逐渐写入的。
来看看这些写入操作的特征,该方法我们在实验 03使用过:
可以看到写入的线程是 page_clean_thread,是一个刷脏操作,这样就能理解数据为什么是慢慢写入的。
也可以看到每个 IO操作的大小是 16K,也就是刷数据页的操作。
结论:
我们可以看到,
1. MySQL会基本遵守 max_heap_table_size的设定,在内存不够用时,直接将表转到磁盘上存储。
2.由于引擎不同(内存中表引擎为 heap,磁盘中表引擎则跟随 internal_tmp_disk_storage_engine的配置),本次实验写磁盘的数据量和实验 05中使用内存的数据量不同。
3.如果临时表要使用磁盘,表引擎配置为 InnoDB,那么即使临时表在一个时间很短的 SQL中使用,且使用后即释放,释放后也会刷脏页到磁盘中,消耗部分 IO。
SQL临时表的区别(数据库临时表和正常表的区别)
在sqlserver中请用sql创建一张用户临时表和系统临时表,里面包含两个字段ID和IDValues,类型都是int型
用户临时表:createtable#xx(IDint,IDValuesint)
系统临时表:createtable##xx(IDint,IDValuesint)
区别:
用户临时表只对创建这个表的用户的Session可见,对其他进程是不可见的.
当创建它的进程消失时这个临时表就自动删除.
全局临时表对整个SQLServer实例都可见,但是所有访问它的Session都消失的时候,它也自动删除.
希望你能理解!
MySQL 如何查看当前数据库中建立的临时表,s
提到MySQL临时表,我们都很熟悉了,一般来说,分为两类:
1. MySQL临时表引擎,名字叫做 Memory。比如
create table tmp1(id int, str1 varchar(100)) engine= memory;
由参数max_heap_table_size来控制,超过报错。
2.非临时表的引擎,这里又分为两类:
用户自定义的临时表,比如:
create temporary table(id int, str1 varchar(100));SQL执行过程中产生的内部临时表,比如:UNION,聚合类ORDER BY,派生表,大对象字段的查询,子查询或者半连接的固化等等场景。
那么这两种临时表的计数器通常用show global status like'%tmp_%tables%'来查看。比如
mysql> show status like'%tmp_%tables%';``+-------------------------+-------+``| Variable_name| Value|``+-------------------------+-------+``| Created_tmp_disk_tables| 0|``| Created_tmp_tables| 0|``+-------------------------+-------+``2 rows in set(0.00 sec)以上结果分别代表,只创建磁盘上的临时表计数以及临时表的总计数。这两个计数器由参数 tmp_table_size和 max_heap_table_size两个取最小值来控制。
那在 MySQL 5.7之前,这个 SQL运行中产生的临时表是 MYISAM,而且只能是 MYISAM。那 MySQL从 5.7开始提供了参数 Internal_tmp_mem_storage_engine来定义内部的临时表引擎,可选值为 MYISAM和 INNODB。当然这里我们选择 INNODB。并且把内部的临时表默认保存在临时表空间 ibtmp1(可以用参数 innodb_temp_data_file_path设置大小以及步长等)下。当然这里我们得控制下 ibtmp1的大小,要不然一个烂SQL就把磁盘整爆了。
但是MySQL 5.7之前都没有解决如下问题:
VARCHAR的变长存储。那就是如果临时表的字段定义是 VARCHAR(200),那么映射到内存里处理的字段变为CHAR(200)。假设 VARCHAR(200)就存里一个字符"Y",那岂不是很大的浪费。
大对象的默认磁盘存储,比如 TEXT,BLOB, JSON等,不管里面存放了啥,直接转化为磁盘存储。
MySQL 8.0开始,专门实现了一个临时表的引擎 TempTable,解决了 VARCHAR字段的边长存储以及大对象的内存存储。由变量 interal_tmp_mem_storage_engine来控制,可选值为 TempTable(默认)和 Memory;新引擎的大小由参数temp_table_max_ram来控制,默认为1G。超过了则存储在磁盘上(ibtmp1)。并且计数器由性能字典的表 memory_summary_global_by_event_name来存储。
mysql> SELECT* FROM performance_schema. memory_summary_global_by_event_name WHERE event_name like'%temptable%'G*************************** 1. row*************************** EVENT_NAME:**memory/temptable/physical_disk** COUNT_ALLOC: 0 COUNT_FREE: 0 SUM_NUMBER_OF_BYTES_ALLOC: 0 SUM_NUMBER_OF_BYTES_FREE: 0 LOW_COUNT_USED: 0 CURRENT_COUNT_USED: 0 HIGH_COUNT_USED: 0 LOW_NUMBER_OF_BYTES_USED: 0CURRENT_NUMBER_OF_BYTES_USED: 0 HIGH_NUMBER_OF_BYTES_USED: 0*************************** 2. row*************************** EVENT_NAME:**memory/temptable/physical_ram** COUNT_ALLOC: 1 COUNT_FREE: 0 SUM_NUMBER_OF_BYTES_ALLOC: 1048576 SUM_NUMBER_OF_BYTES_FREE: 0 LOW_COUNT_USED: 0 CURRENT_COUNT_USED: 1 HIGH_COUNT_USED: 1 LOW_NUMBER_OF_BYTES_USED: 0CURRENT_NUMBER_OF_BYTES_USED: 1048576 HIGH_NUMBER_OF_BYTES_USED: 10485762 rows in set(0.03 sec)以上 memory/temptable/physical_disk代表放入磁盘上的临时表计数情况。
memory/temptable/physical_ram代表放入内存的临时表计数情况。
那总结下MySQL 8.0引入的 TempTable引擎:
默认内部临时表引擎。
支持变长字符类型的实际存储。
设置变量 temp_table_max_ram来控制实际存储内存区域大小。
文章分享结束,数据库临时表和在数据库中临时表什么时候会被清除呢的答案你都知道了吗?欢迎再次光临本站哦!