何时产生临时表?

我们在执行某些SQL语句的时候有可能会生成临时表.我们应该尽量的去避免临时表.因为临时表会浪费内存和时间.那么什么情况下会产生临时表呢?

PowerBet
If there is an ORDER BY clause and a different GROUP BY clause, or if the ORDER BY or GROUP BY contains columns from tables other than the first table in the join queue, a temporary table is created.
ORDER BY 子句和一个不一样的 GROUP BY 子句 或者 ORDER BY 子句和一个不一样的 GROUP BY 子句,或者 ORDER BY 或 GROUP BY 的列不是来自JOIN语句序列的第一个表,就会产生临时表.

个人测试后结论 :
  1. 如果GROUP BY 的列没有索引,产生临时表.
  2. 如果GROUP BY时,SELECT的列不止GROUP BY列一个,产生临时表.

  3. 如果GROUP BY的列有索引,ORDER BY的列没索引.产生临时表.
  4. 如果GROUP BY的列和ORDER BY的列不一样,即使都有索引也会产生临时表.
  5. 如果GROUP BY或ORDER BY的列不是来自JOIN语句第一个表.会产生临时表.

DISTINCT combined with ORDER BY may require a temporary table.

DISTINCT 和 ORDER BY 一起使用时可能需要临时表
个人测试后结论 :
  1. 如果DISTINCT 和 ORDER BY的列没有索引,产生临时表.

If you use the SQL_SMALL_RESULT option, MySQL uses an in-memory temporary table, unless the query also contains elements (described later) that require on-disk storage.[官方说明]
用了 SQL_SMALL_RESULT, mysql就会用内存临时表。
个人测试后结论 :
  1. 从来没用过这个,反正没生成.

最后再说一下filesort.

filesort 这个名字取得太搓逼了。 filesort的意思是只要一个排序无法使用索引来排序,就叫filesort。他和file没半毛钱关系。filesort应该叫做sort。意思是说如果无法用已有index来排序,那么就需要数据库服务器额外的进行数据排序,这样其实是会增加性能开销的。

何时产生临时表?

时间: 2024-12-28 01:37:41

何时产生临时表?的相关文章

[转]表变量和临时表的比较

本文转自;http://www.cnblogs.com/CareySon/archive/2012/06/11/TableVariableAndTempTable.html 关于表变量是什么(和表变量不是什么),以及和临时表的比较让很多人非常困惑.虽然网上已经有了很多关于它们的文章,但我并没有发现一篇比较全面的.在本篇文章中,我们将探索表变量和临时表是什么(以及不是什么),然后我们通过使用临时表和表变量对其解密. 表变量 表变量在SQL Server 2000中首次被引入,那么,什么是表变量呢?

在oracle存储过程中创建临时表

在oracle的存储过程中,不能直接使用DDL语句,比如create.alter.drop.truncate等. 那如果我们想在存储过程中建立一张临时表就只能使用动态sql语句了: create or replace procedure pro as str_sql varchar2(100); begin -- 创建临时表 str_sql := 'create global temporary table temp_table ( col1 varchar2(10), col2 number

Oracle中的临时表

Oracle中的临时表 在Oracle中,临时表是"静态"的,它与普通的数据表一样只需要一次创建,其结构从创建到删除的整个期间都是有效的.相对于其他类型的表,临时表只有在用户实际向表中添加数据时,才会为其分配空间,并且分配的空间来自临时表空间.这就避免了与永久对象的数据争用存储空间. 创建临时表的语法如下: CREATE GLOBAL TEMPORARY TABLE table_name( column_name data_type,[column_name data_type,...

ORACLE临时表总结

临时表概念 临时表就是用来暂时保存临时数据(亦或叫中间数据)的一个数据库对象,它和普通表有些类似,然而又有很大区别.它只能存储在临时表空间,而非用户的表空间.ORACLE临时表是会话或事务级别的,只对当前会话或事务可见.每个会话只能查看和修改自己的数据. 临时表语法 临时表分类 ORACLE临时表有两种类型:会话级的临时表和事务级的临时表. 1)ON COMMIT DELETE ROWS 它是临时表的默认参数,表示临时表中的数据仅在事物过程(Transaction)中有效,当事物提交(COMMI

InMemory:在内存中创建临时表和表变量

在Disk-Base数据库中,如果系统频繁地创建和更新临时表,大量的IO操作集中在tempdb中,tempdb很可能成为系统性能的瓶颈.在SQL Server 2016的内存(Memory-Optimized)数据库中,如果考虑使用内存优化结构来存储临时表,表变量,表值参数的数据,那么将完全消除IO操作的负载消耗,发挥大内存的优势,大幅提高数据库的性能. 在SQL Server 2016中,能够直接创建内存优化的表类型,表变量和表值参数的数据只存储在内存中:不能直接在内存中创建临时表,但是,SQ

解决临时表空间的报错

报错信息:[HY000](1652) [Oracle][ODBC][Ora]ORA-01652: 无法通过 128 (在表空间 TEMP 中) 扩展 temp 段 原因分析:oracle临时表空间不足,事务执行一般将会报ora-01652无法扩展临时段的错误.因为oracle总是尽量分配连续空间,一旦没有足够的可分配空间或者分配不连续就会出现上述的现象. 回忆下临时表空间的作用: 临时表空间主要用途是在数据库进行排序运算[如创建索引.order by及group by.distinct.unio

当 IDENTITY_INSERT 设置为 OFF 时,不能向表 '#TT' 中的标识列插入显式值。 sql server 临时表

当 IDENTITY_INSERT 设置为 OFF 时,不能向表 '#TT' 中的标识列插入显式值.我是在SqlServer写存储过程中遇到的这个错误,当时就心想:临时表怎么会有主键呢,我也没有设置主键.然后我就和同事一块调试,终于发现了.原因就是我把真实的数据表中id(其实就是主键)取出来放到临时表(#TT)中,一开始是以为把主键的属性取出来了.后来又一起调试,发现不是那么回事,1.原来SqlServer会自动给临时表设置主键,如果你要插入数据的话,还要打开主键,这样你才能插入数据.“当 ID

6.2、临时表--Oracle模式对象

临时表的特点: (1).只有在用户向表中添加数据时,Oracle才会为其分配存储空间. (2).为临时表分配空间来自临时表空间,避免与永久对象的数据争取存储空间: (3).临时表占用的存储空间,随着事务结束或会话终止而被释放,数据也丢失: (4).和堆表一样,可以在临时表上创建索引.视图和触发器等. 事务级别临时表: --创建事务临时表user_trans create global temporary table user_trans( id number, uname varchar2(10

Oracle临时表空间组

Oracle 10g之前,同一用户的多个会话只可以使用同一个临时表空间,因为在给定的时间只有一个临时表空间默认给用户,为了解决这个潜在的瓶颈,Oracle支持临时表空间组即包含多个临时表空间的集合.临时表空间组逻辑上就相当于一个临时表空间. Example: 1 SQL>create temporary tablespace temp1 tempfile '/u01/app/oracle/oradata/orcl/temp01.dbf' size 10M; 2 3 SQL>create tem

MYSQL 磁盘临时表和文件排序

因为Memory引擎不支持BOLB和TEXT类型,所以,如果查询使用了BLOB或TEXT列并且需要使用隐式临时表,将不得不使用MyISAM磁盘临时表,即使只有几行数据也是如此. 这会导致严重的性能开销..即使配置Mysql将临时表存储在内存块设备上(ram-disk),依然需要很多昂贵的系统调用. 最好的解决方案是尽量避免使用BLOB和TEXT类型.如果实在无法避免,有一个技巧是在所有用到BLOG字段的地方都使用SUBSTRING(culumn,length)将列值转换为字符串(在order b