oracle 试图 临时值和oracle创建临时表语句 sql优化

Oracle性能调优:Oracle临时表之临时表的应用问题 -学路网-学习路上 有我相伴
Oracle性能调优:Oracle临时表之临时表的应用问题
来源:examw &责任编辑:小易 &
网上有人给出了最佳的优化思路是:&&& 1.先将大表中满足条件的记录抽出来生成一张临时表。&&& 2.再将这较小的临时表与另一张较小的表进行关联查询。&&& 先不论思路是否值得商榷,这把临时表当成中转站的做法还是很值得肯定&&& 临时表本质上就是一种cache的表现形式,Oracle的临时表都是事先建好的&&& 一旦用了临时表,存放的就是和本会话相关的数据&&& 没有人会傻乎乎地用临时表来保存本应该共享的数据&&& with子查询实际上也是用了临时表,Oracle会替你创建一张临时表&&& 因此临时表的开销WITH子查询也会有。只要把AUTOTRACE打开你就会看到REDO的开销&&& 关于临时表的使用至少会带来两个问题:&&& 1)主查询的执行计划问题&&& 2)额外的写redo的问题&&& 如果,&&& 临时表作为复杂查询条件的中间结果用于主查询,因为临时表里往往只是个别字段的少量数据,1)的问题比较突出;&&& 如果,&&& 临时表作为最终展现前的结果归集,可能临时表会有比较多字段的较多数据,2)的问题比较突出&&& ㈠ 主查询的执行计划问题&&& 9i临时表由于动态采样level 1,还得用hint,10g比较好用&&& 比较复杂的存储过程(比如数据抽取)可能用到临时表,比实体表优势就是redo少,自动清除&&& 对于临时表的缺陷--采样问题,执行计划的问题其实主要是临时表的cardinality的问题&&& 对于临时表方案,建议动态采样。9IR2以后的版本使用DYNAMIC_SAMPLING 参数或hint能基本避免&&& 如写上 HINT强制它采样 /*+dynamic_sampling(t 0) */&&& cardinality hint分段提示是个比较好的最佳实践&&& 例如:&&& 临时表里的数据量有大起大落的情形,Oracle只会在硬解析的时候做一次取样&&& 当临时表数据量变化之后,原来的执行计划可能已经不是最优的&&& 碰到这种问题建议使用动态SQL&&& 临时表的数据量在插入结束之后可以通过SQL%ROWCOUNT得知&&& 然后在动态SQL里面拼入cardinality提示,这个提示没有必要精确,要不然你就会有无数的硬解析了&&& 建议给它设置的坎是5000, 即1-5000当作5000处理,当作10000,&&& 如此类推,CARDINALITY = CEIL(SQL%ROWCOUNT/5000)*5000,&&& 你也可以通过测试调整出一个合理的值&&& ㈡ 临时表的redo生成&&& 临时表不会为它们的块生成redo.因此,对临时表的操作不是"可恢复的".&&& 修改临时表中的一个块时,不会将这个修改记录到重做日志文件中&&& 不过,临时表确实会生成undo,而且这个undo 会计入日志。因此,临时表也会生成一些redo.&&& 为什么需要生成undo?这是因为你能回滚到事务中的一个SAVEPOINT&&& 临时表可以有约束,正常表有的一切临时表都可以有&&& 可能有一条INSERT 语句要向临时表中插入500 行,但插入到第500 行时失败了,&&& 这就要求回滚这条语句&&& 由于临时表一般表现得就像"正常"表一样,所以临时表必须生成undo&&& 由于undo 数据必须建立日志,因此临时表会为所生成的undo 生成一些重做日志&&& redo的出现是为了保护undo&&& 不过,在临时表上运行的SQL 语句主要是INSERT 和SELECT&&& INSERT 只生成极少的undo 另外SELECT 根本不生成undo&&& 所以,临时表的redo是因为要undo生成,实际上多数使用临时表的情况是用于查询&&& 因此往往没有undo的需求&&& ㈢ 临时表的使用场景&&& ① 循环SQL&&& 最初优化前,系统中有很多类似的sql循环执行,效率很低&&& 比如通常会有通过接口传入数千的参数,然后根据这些参数循环执行sql&&& 优化时,可先把这些参数insert到临时表,然后关联该临时表一次执行以达到优化的效果&&& ② 多表关联&&& 利用临时表简化有太多表关联的复杂SQL&&& ③ 如果某个数据集会重复多次使用的情况下建议使用临时表&&& ④ 临时表在逻辑复杂的大数据量更新的时候很有用,查询部分with就可以了&&& ⑤ 临时表作为复杂查询条件的中间结果用于主查询
本文相关:
- Copyright & 2018 www.xue63.com All Rights Reserved关注51Testing
Oracle性能优化:收缩临时表空间
发表于: 09:41 &作者:robinson_0612 & 来源:51Testing软件测试网采编
推荐标签:
  当排序操作、重建索引等大型操作无法在内存中完成时,临时表空间将为排序提供便利。一般情况下临时表空间为多个用户,多个会话所共  享。不能为会话分批空间配额。临时表空间耗用过度且在不能自动扩展的情形下将收到“ORA-1652:unable to extend temp segment” 错误.下面  描述了过度扩展后如何释放临时表空间。  一、临时表空间何时释放  检索数据的会话游标关闭时,占用的临时空间即被释放  关闭,重启(一般情况),会话 log off  二、释放过大的临时表空间&span style="font-family:V"&1、查看当前临时表空间的情况SQL& select * from v$version where rownum&2;BANNER---------------------------------------------------------------- Database 10g Release 10.2.0.3.0 - 64bit ProductionSQL& @temp_sort_segment+==================================================================================+| Segment Name&&&&&&&&&&& : The segment name is a concatenation of the&&&&&&&&&&&& ||&&&&&&&&&&&&&&&&&&&&&&&&&& SEGMENT_FILE (File number of the first extent)&&&&&&&& ||&&&&&&&&&&&&&&&&&&&&&&&&&& and the&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ||&&&&&&&&&&&&&&&&&&&&&&&&&& SEGMENT_BLOCK (Block number of the first extent)&&&&&& || Current Users&&&&&&&&&& : Number of active users of the segment&&&&&&&&&&&&&&&&& || Total Temp Segment Size : Total size of the temporary segment in MB&&&&&&&&&&&&& || Currently Used Bytes&&& : Bytes allocated to active sorts&&&&&&&&&&&&&&&&&&&&&&& || Extent Hits&&&&&&&&&&&& : Number of times an unused extent was found in the pool || Max Size&&&&&&&&&&&&&&& : Maximum number of MB ever used&&&&&&&&&&&&&&&&&&&&&&&& || Max Used Size&&&&&&&&&& : Maximum number of MB used by all sorts&&&&&&&&&&&&&&&& || Max Sort Size&&&&&&&&&& : Maximum number of MB used by an individual sort&&&&&&& || Free Requests&&&&&&&&&& : Number of requests to deallocate&&&&&&&&&&&&&&&&&&&&&& |+==================================================================================+--&此时临时表空间go_temp中达到了32GB&&& Tablespace& Segment Current Currently Pct.&& Extent&&&&& Max Max Used Max Sort&&&& Free&&&&&&&&& Name&&&& Name&& Users&& Used MB Used&&&& Hits& Size MB& Size MB& Size MB Requests-------------- -------- ------- --------- ---- -------- -------- -------- -------- --------TEMP&&&&&&&&&& SYS.0.0&&&&&&& 4&&&&&&&& 4&&& 2&&& 1,864&&&&& 217&&&&& 217&&&&& 217&&&&&&& 0GO_TEMP&&&&&&& SYS.0.0&&&&&&& 0&&&&&&&& 0&&& 0&&& 1,305&& 32,766&&&&& 367&&&&& 367&&&&&&& 0**************&&&&&&&&& ------- ---------&&&&& -------- -------- -------- -------- --------sum&&&&&&&&&&&&&&&&&&&&&&&&&& 4&&&&&&&& 4&&&&&&&& 3,169&& 32,983&&&&& 584&&&&& 584&&&&&&& 0SQL& col tbsname format a15SQL& select s.name tbsname,t.name,(t.bytes/) mb,t.status& 2& from v$tablespace s,v$tempfile t&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 3& where s.ts# = t.ts#;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&TBSNAME&&&&&&&& NAME&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& MB STATUS--------------- -------------------------------------------------- ---------- -------TEMP&&&&&&&&&&& /u02/database/ORADB/temp/tempORADB.dbf&&&&&&&&&&&&&&&&& 235 ONLINEGO_TEMP&&&&&&&& /u02/database/ORADB/temp/ORADB_tempORADB.dbf&&&&&&&&& 32767 ONLINESQL& @temp_usage2&&&&& --&此时temp已使用的为4MB,而GO_TEMP未使用TABLESPACE&&&&&&&&&&&& MB_TOTAL&&& MB_USED&&& MB_FREE-------------------- ---------- ---------- ----------GO_TEMP&&&&&&&&&&&&&&&& 32767&&&&&&&&& 0&&&&& 32767TEMP&&&&&&&&&&&&&&&&&&&&& 218&&&&&&&&& 4&&&&&&& 2142、观察及分析临时表空间的耗用情况SQL& select count(*) from big_&&& --&开启另一个session& COUNT(*)----------&& 2000000SQL& select * from big_table order by 2,3,4,5,7,8& --&对big_table 实施排序SQL& alter index pk_stock_tbl_&&&&& --&开启另一个session重建索引SQL& @temp_sort_segment.sql&&&&&&&&&& --&可以看到此时temp表空间耗用达到234MB,go_temp的耗用达到375MB&&& Tablespace& Segment Current Currently Pct.&& Extent&&&&& Max Max Used Max Sort&&&& Free&&&&&&&&& Name&&&& Name&& Users&& Used MB Used&&&& Hits& Size MB& Size MB& Size MB Requests-------------- -------- ------- --------- ---- -------- -------- -------- -------- --------TEMP&&&&&&&&&& SYS.0.0&&&&&&& 4&&&&&& 234&&& 2&&& 2,077&&&&& 234&&&&& 234&&&&& 230&&&&&&& 0GO_TEMP&&&&&&& SYS.0.0&&&&&&& 1&&&&&& 375&&& 1&&& 2,055&& 32,766&&&&& 375&&&&& 375&&&&&&& 0**************&&&&&&&&& ------- ---------&&&&& -------- -------- -------- -------- --------sum&&&&&&&&&&&&&&&&&&&&&&&&&& 5&&&&&& 609&&&&&&&& 4,132&& 33,000&&&&& 609&&&&& 605&&&&&&& 0SQL& @temp_sort_users.sql& --&获得当前排序的会话&& INST_ID SID_SERIAL Username&& OSUSER&&&&&&&&& SPID&&&&&&&& MODULE&&&& PROGRAM&&&&&& MB_USED TABLESPACE STATEMENTS---------- ---------- ---------- --------------- ------------ ---------- ---------- ---------- ---------- ----------&&&&&&&& 1 & SCOTT&&&&& oracle&&&&&&&&& 14456&&&&&&& SQL*Plus&&&&&&&&& 234 TEMP&&&&&&&&&&&&&&& 4&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& B (TNS V1-&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& V3)&&&&&&&& 1 & GO_ADMIN&& oracle&&&&&&&&& 2480&&&&&&&& SQL*Plus&&&&&&&&& 375 GO_TEMP&&&&&&&&&& 1&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& B (TNS V1-&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& V3)3、使用resize,缩小临时表空间,如不能缩小,转到下一步SQL& SELECT 'alter database tempfile ''' || a.name || ''' resize ' || b.siz || 'M;'& resize_command& 2& FROM v$tempfile a& 3&&&&&&& ,(SELECT ceil(tmsize.maxblk * bk.value / 1024 / 1024) siz& 4&&&&&& FROM (SELECT nvl(MAX(segblk#), 128) maxblk& 5&&&&&&&&&&& FROM v$sort_usage) tmsize& 6&&&&&&&&&&&& ,(SELECT VALUE& 7&&&&&&&&&&& FROM v$parameter& 8&&&&&&&&&&& WHERE NAME = 'db_block_size') bk)RESIZE_COMMAND----------------------------------------------------------------------------------------alter database tempfile '/u02/database/ORADB/temp/ORADB_tempORADB.dbf' resize 106M;alter database tempfile '/u02/database/ORADB/temp/tempORADB.dbf' resize 106M;--&实际上此时占用32GB的临时数据文件已经缩小alter database tempfile '/u02/database/ORADB/temp/ORADB_tempORADB.dbf' resize 106M;Database altered.--&为便于演示,此时假定TEMP为过大的临时表空间且不能释放--&下面调整表明已使用空间超出了分配的空间SQL& alter database tempfile '/u02/database/ORADB/temp/tempORADB.dbf' resize 106M;&alter database tempfile '/u02/database/ORADB/temp/tempORADB.dbf' resize 106M*ERROR at line 1:ORA-03297: file contains used data beyond requested RESIZE valueSQL& select count(*) from v$sort_usage where tablespace='TEMP';&& --&当前有未释放的临时段& COUNT(*)----------&&&&&&&& 4&&&&&&&&/**************************************************//* Author: Robinson Cheng&&&&&&&&&&&&&&&&&&&&&&&& *//* Blog:&&&&&& *//* MSN:&&&&&&&&&&&&&&&& *//* QQ:&&&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&& *//**************************************************/&&&&&&&4、新建一个中转临时表空间SQL& create temporary tablespace temp2 tempfile '/u02/database/ORADB/temp/ORADB_temp02.dbf'& 2& size 10&Tablespace created.--&如果此时过大的临时表空间为缺省的临时表空间,则必须将缺省的临时表空间设置为新的临时表空间之后SQL& select property_name,property_value from database_properties& 2& where property_name like 'DEFAULT_TEMP_TABLESPACE';PROPERTY_NAME&&&&&&&&&&&&&&&&& PROPERTY_VALUE------------------------------ --------------------DEFAULT_TEMP_TABLESPACE&&&&&&& TEMP&SQL& alter database default temporary tablespace temp2;Database altered.5、转移用户到中转临时表空间--&过大临时表空间上的那些用户需要迁移到新建的临时表空间--&查询dba_users视图查询哪些用户位于过大的临时表空间之上--&并使用下面的命令将其切换到新的临时表空间alter user &username& temporary tablespace temp2;6.等到过大临时表空间上的没有临时段被使用,即已经全部释放即可删除过大的临时表空间SQL&&&& --&由于当前用户为scott,所以临时表空间未能释放USER is "SCOTT"SQL& conn / as sysdba&& --&切换到sysdbaConnected.SQL& @temp_usage2&&&&& --&临时段已经被释放TABLESPACE&&&&&&&&&&&& MB_TOTAL&&& MB_USED&&& MB_FREE-------------------- ---------- ---------- ----------GO_TEMP&&&&&&&&&&&&&&&&&& 106&&&&&&&&& 0&&&&&&& 106TEMP&&&&&&&&&&&&&&&&&&&&& 235&&&&&&&&& 0&&&&&&& 235--&如果没有释放在可以kill session的情况下kill session.利用前面获得的sid,serial#来执行(前提是允许该情况发生).alter system kill session ''7.删除过大的临时表空间SQL& alter tablespace t&& --&先将其脱机Tablespace altered.SQL& drop tablespace temp including co&& --&删除临时表空间及相应的文件Tablespace dropped.SQL& select s.name tbsname,t.name,(t.bytes/) mb,t.status&&&&&&&&&&&&&&&&&&&& 2& from v$tablespace s,v$tempfile t&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 3& where s.ts# = t.ts#;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&TBSNAME&&&&&&&& NAME&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& MB STATUS--------------- -------------------------------------------------- ---------- -------GO_TEMP&&&&&& /u02/database/ORADB/temp/ORADB_tempORADB.dbf&&&&&&&&&& 106 ONLINETEMP2&&&&&&& /u02/database/ORADB/temp/ORADB_temp02.dbf&&&&&&&&&&&&&&& 10 ONLINE--&也可以使用下面的命令来完成仅仅删除单个文件ALTER DATABASE TEMPFILE '/u02/database/ORADB/temp/tempORADB.dbf' DROP INCLUDING DATAFILES; --&删除单个文件7、根据需求可以创建原来的临时表空间并将切换出去用户切换到此临时表空间&/span&  三、总结  1、关注alert_&sid&.log文件中的ORA-1652错误并调查什么原因导致该错误。有些时候并不是由于当前的 导致临时表空间不能扩展,很可能由于前一个SQL耗用了99%的临时表空间,而后一个SQL执行时即出现错误。对于此类情况应调查前一SQL并调整避免过多的磁盘排序。  2、如果基于空间压力应该关闭临时表空间的自动扩展。因此为临时表空间设定合理的大小就成了一个问题。个人的解决方案是首先检查ORA-1652,其次是观察业务高峰期的峰值。如前面查询中的字段Max Size(: Maximum number of MB ever used)的值来预估。如果大师们有更好的建议不妨拍砖。  3、通过重启数据库,临时表空间所耗用的大小有时候并不能缩小。  4、在Oracle 11g之前一般是通过创建中转临时表空间来达到缩小的目的。不是很完美,因为有些时候临时段未释放导致不能删除临时表空间及数据文件。在11g可以直接使用下面的命令来完成:  alter tablespa  alter tablespace temp shrink tempfile '&dir&' keep n &mb/kb&;  5、系统缺省的临时表空间不能被删除,因此如果系统缺省的临时表空间过大删除前应该新置一个系统缺省的临时表空间。  6、删除过大临时表空间前其上的用户应该先将其设定到中转临时表空间,重建后再将其置回原状态。  7、减少磁盘排序的首要任务调整SQL,如避免笛卡尔积,为表添加合理的索引等。其次要考虑PGA的值是否设定合理。
搜索风云榜
51Testing官方微信
51Testing官方微博
测试知识全知道1. 复制表结构及其数据:
create table table_name_new as select * from table_name_old
2. 只复制表结构:
create table table_name_new as select * from table_name_old where 1=2;
create table table_name_new like table_name_old
3. 只复制表数据:
如果两个表结构一样:
insert into table_name_new select * from table_name_old
如果两个表结构不一样:
insert into table_name_new(column1,column2...) select column1,column2... from table_name_old
4、创建Oracle 临时表,可以有两种类型的临时表:
会话级的Oracle临时表事务级的临时表 。
1) 会话级的临时表因为这这个临时表中的数据和你的当前会话有关系,当你当前SESSION 不退出的情况下,临时表中的数据就还存在,而当你退出当前SESSION 的时候,临时表中的数据就全部没有了,当然这个时候你如果以另外一个SESSION 登陆的时候是看不到另外一个SESSION 中插入到临时表中的数据的。
即两个不同的SESSION 所插入的数据是互不相干的。当某一个SESSION 退出之后临时表中的数据就被截断(truncate table ,即数据清空)了。会话级的临时表创建方法:
Create Global Temporary Table Table_Name
(Col1 Type1,Col2 Type2...) On Commit Preserve Rows ;
create global temporary table Student
Stu_id Number(5),
Class_id Number(5),
Stu_Name Varchar2(8),
Stu_Memo varchar2(200)
) on Commit Preserve R
2) 事务级临时表是指该临时表与事务相关,当进行事务提交或者事务回滚的时候,Oracle临时表中的数据将自行被截断,其他的内容和会话级的临时表的一致(包括退出SESSION 的时候,事务级的临时表也会被自动截断)。事务级临时表的创建方法:
Create Global Temporary Table Table_Name
(Col1 Type1,Col2 Type2...) On Commit Delete Rows ;
create global temporary table Classes
Class_id Number(5),
Class_Name Varchar2(8),
Class_Memo varchar2(200)
) on Commit delete R
3) 两中类型临时表的区别
会话级临时表采用
on commit preserve rows ;而事务级则采用 on commit delete rows
;用法上,会话级别只有当会话结束临时表中的数据才会被截断,而且事务级临时表则不管是 commit 、 rollback 或者是会话结束,Oracle临时表中的数据都将被截断
4 )什么时候使用临时表
1 )、当某一个 SQL 语句关联的表在 2 张及以上,并且和一些小表关联。可以采用将大表进行分拆并且得到比较小的结果集合存放在临时表中
2 )、程序执行过程中可能需要存放一些临时的数据,这些数据在整个程序的会话过程中都需要用的等等。
3)、临时表的不足之处
1 )不支持 lob 对象,这也许是设计者基于运行效率的考虑,但实际应用中确实需要此功能时就无法使用临时表了。
2 )不支持主外键关系
oracle怎么拷贝一个表的数据进入临时表
比如临时表叫temp,你要查询的语句为select * from 表名 where id=1。
如果temp表存在:
insert into temp select * from 表名 whe...
Oracle将查询结果存入临时表的写法
有时候因为查询结果很大且需要再跟其它表进行不同形式的连表查询,这是如果整个sql写下来不仅看起来臃肿而且查询效率也很低,Oracle提供了一种将查询结果...
复制表数据、表结构;临时表创建
项目中需要用到。总结下。
1.复制表结构
select * into table_b from table_a where 11,永假,用于只取结构不取数据的场合;1==1,永真。
2.复制表数...
利用临时表备份,需要修改的数据表
select * into #tblTest1_bak from tbTest1
select * from #tblTest1_bak
Oracle存储过程中使用临时表的替代方案
近日接手一个分析类老项目改造工作,用户要求使用Oracle数据库(原先版本为SQL Server2005),由于原项目中大量使用存储过程实现复杂的业务数据查询,在SQL Server中由于使用表值函数...
利用存储过程将Excel中数据导入到数据库表中
点击“Import”进入process方法:(Action开始
将文件上传到服务器:
DynaActionForm tariffForm = (Dyna...
oracle 将查询结果创建表并插入
如果在sql server的t-sql,是很容易的:select * into 新表这个新表不存在的话,就创建之。其实在oracle,也很容易,不过是另一种写法:create table 新表 as ...
如何使用临时表将2个查询结果并在一起
Oracle两种临时表的创建与使用详解
ORACLE数据库除了可以保存永久表外,还可以建立临时表temporary tables。这些临时表用来保存一个会话SESSION的数据,或者保存在一个事务中需要的数据。当会话退出或者用户提交comm...
Oracle临时表 和 插入多条语句 用法
1、创建临时表
ON COMMIT PRESERVE ROWS 事务级别的,默认是回话级别的
没有更多推荐了,有一个系统从Oracle迁移到MySQL,在Oracle中运行很快,在MySQL基本运行不出来(等了10分钟都无法运行出来),该加的索引都加了,最后用临时表解决问题。
SELECT COUNT(1)
FROM (SELECT a.vendor_id
FROM g_VENDOR a LEFT JOIN g_VENDOR_CONTACT_PERSON b ON a.vendor_id = b.vendor_id) a
LEFT JOIN (SELECT c.vendor_id,
d.vendor_classify_id,
d.vendor_classify_code,
d.vendor_classify_name
FROM g_vendor_classify_link c, ipb_vendor_classify d
WHERE c.vendor_classify_id = d.vendor_classify_id) e ON a.vendor_id =e.vendor_id
LEFT JOIN (SELECT g.object_id,
f.file_name,
f.file_type,
f.update_time,
f.file_dir,
h.attachment_type
FROM g_attachment_object_relation g,
g_attachment
LEFT JOIN g_attachment_extend
ON f.attachment_id = h.attachment_id
WHERE f.attachment_id = g.attachment_id
AND f.state = 2
AND g.state = 1
AND f.job_type_code = 'g_Vendor_Attachment_File') h ON a.vendor_id = h.object_
+----+-------------+------------+--------+--------------------------------+--------------------------------+---------+--------------------- +------+----------------------------------------------------+
| id | select_type | table
| possible_keys
| key_len | ref
| rows | Extra
+----+-------------+------------+--------+--------------------------------+--------------------------------+---------+--------------------- +------+----------------------------------------------------+
1 | PRIMARY
| &derived2& | ALL
| 5009 | NULL
1 | PRIMARY
| &derived3& | ref
| &auto_key0&
| &auto_key0&
| a.vendor_id
1 | PRIMARY
| &derived4& | ALL
| 2970 | U Using join buffer (Block Nested Loop) |
4 | DERIVED
| 2970 | Using where
4 | DERIVED
| idx2_g_attachment_object_rel | idx2_g_attachment_object_rel | 98
| f.attachment_id
1 | Using where
4 | DERIVED
| ind_tae_attachment_id
| ind_tae_attachment_id
| f.attachment_id
3 | DERIVED
| index_vendor_classify
457 | U Using index
3 | DERIVED
| eq_ref | PRIMARY
| c.vendor_classify_id |
2 | DERIVED
| ind_sv_VENDOR_SOURCE
131 | Using index
2 | DERIVED
| ind_svcp_vendor_id
| ind_svcp_vendor_id
| a.vendor_id
1 | Using index
+----+-------------+------------+--------+--------------------------------+--------------------------------+---------+------------------------------------+------+--------------------------------------+改成如下方式,一共花费6s出来结果:
CREATE TEMPORARY TABLE tmp_g_VENDOR(vendor_id VARCHAR(32));
CREATE INDEX ind_tsv_vendor_id ON tmp_g_VENDOR(vendor_id);
INSERT INTO tmp_g_VENDOR SELECT a.vendor_id
FROM (SELECT a.vendor_id
FROM g_VENDOR a LEFT JOIN g_VENDOR_CONTACT_PERSON b ON a.vendor_id = b.vendor_id) a
LEFT JOIN (SELECT c.vendor_id,
d.vendor_classify_id,
d.vendor_classify_code,
d.vendor_classify_name
FROM g_vendor_classify_link c, ipb_vendor_classify d
WHERE c.vendor_classify_id = d.vendor_classify_id) e ON a.vendor_id = e.vendor_
CREATE TEMPORARY TABLE tmp_attachment_object(object_id VARCHAR(100));
CREATE INDEX ind_tao_object_id ON tmp_attachment_object(object_id);
INSERT INTO tmp_attachment_object SELECT g.object_id
g_attachment_object_relation g,
g_attachment
g_attachment_extend
ON f.attachment_id = h.attachment_id
WHERE f.attachment_id = g.attachment_id
AND f.state = 2
AND g.state = 1
AND f.job_type_code = 'g_Vendor_Attachment_File';
SELECT COUNT(1) FROM tmp_g_VENDOR a LEFT JOIN tmp_attachment_object b ON a.vendor_id = b.object_
MySQL5.6找到临时表用到磁盘的SQL
mysql& select version();
+------------+
| version()
+------------+
| 5.6.14-log |
+------------+
【mysql 性能优化】避免临时表
查询当前创建临时表的大小
show global status like 'created_tmp%';
Variable_name
Created_tmp_disk...
mysql临时表产生的执行效率问题改进
公司系统中的任务中一直加载很慢
MySQL-临时表
当工作在非常大的表上时,你可能偶尔需要运行很多查询获得一个大量数据的小的子集,不是对整个表运行这些查询,而是让MySQL每次找出所需的少数记录,将记录选择到一个临时表可能更快些,然后在这些表运行查询。...
MYSQL,临时表优化一例
非原创。 胡伟朋友的因临时表引发的查询性能优化一例。
相关知识: MySQL的SQL Profiler性能分析器http://blog.163.com/li_hx/blog/static/18399...
MySQL临时表
MySQL在执行SQL查询时可能会用到临时表,一般情况下,用到临时表就意味着性能较低。1.临时表存储MySQL临时表分为“内存临时表”和“磁盘临时表”,其中内存临时表默认使用MySQL的MEMORY存...
MySQL 中的两种临时表
外部临时表
通过CREATE TEMPORARY TABLE 创建的临时表,这种临时表称为外部临时表。这种临时表只对当前用户可见,当前会话结束的时候,该临时表会自动关闭。这种临时表的命名与非临时...
MySQL使用临时表的情况
原文地址:http://www.tuicool.com/articles/BBRFN3B
MySQL在以下几种情况会创建临时表:
1、UNION查询;
2、用到TEMPTABLE算法或者是...
MySQL在以下几种情况会创建临时表
(转载)http://blog.csdn.net/xiaolyuh123/article/details/
MySQL在以下几种情况会创建临时表:
1、UNION查询;
MySQL 5.7 内部临时表
本文研究了在没有写查询的情况下,InnoDB行插入时,因内部临时表的问题而发生性能尖刺的情形。
In this blog post, I investigate a case of spiking ...
没有更多推荐了,

我要回帖

更多关于 sql中临时表移植到oracle 的文章

 

随机推荐