为什么临时表创建索引上建立索引会导致redo量巨量增加

二次元同好交流新大陆
扫码下载App
汇聚2000万达人的兴趣社区下载即送20张免费照片冲印
扫码下载App
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:select id from t where num is null可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:select id from t where num=03.应尽量避免在 where 子句中使用!=或&&操作符,否则引擎将放弃使用索引而进行全表扫描。4.应尽量避免在 where 子句中使用or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如:select id from t where num=10 or num=20可以这样查询:select id from t where num=10 union all select id from t where num=205.in 和 not in 也要慎用,否则会导致全表扫描,如:select id from t where num in(1,2,3)&对于连续的数值,能用 between 就不要用 in 了:select id from t where num between 1 and 36.下面的查询也将导致全表扫描:select id from t where name like '李%'若要提高效率,可以考虑全文检索。7. 如果在 where 子句中使用参数,也会导致全表扫描。因为SQL只有在运行时才会解析局部变量,但优化程序不能将访问计划的选择推迟到运行时;它必须在编译时进行选择。然 而,如果在编译时建立访问计划,变量的值还是未知的,因而无法作为索引选择的输入项。如下面语句将进行全表扫描:select id from t where num=@num可以改为强制查询使用索引:select id from t with(index(索引名)) where num=@num8.应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。如:select id from t where num/2=100应改为:select id from t where num=100*29.应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。如:select id from t where substring(name,1,3)='abc'&,name以abc开头的id应改为:select id from t where name like 'abc%'10.不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。11.在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用,并且应尽可能的让字段顺序与索引顺序相一致。12.不要写一些没有意义的查询,如需要生成一个空表结构:select col1,col2 into #t from t where 1=0这类代码不会返回任何结果集,但是会消耗系统资源的,应改成这样:create table #t(...)13.很多时候用 exists 代替 in 是一个好的选择:select num from a where num in(select num from b)用下面的语句替换:select num from a where exists(select 1 from b where num=a.num)14.并不是所有索引对查询都有效,SQL是根据表中数据来进行查询优化的,当索引列有大量数据重复时,SQL查询可能不会去利用索引,如一表中有字段sex,male、female几乎各一半,那么即使在sex上建了索引也对查询效率起不了作用。15. 索引并不是越多越好,索引固然可 以提高相应的 select 的效率,但同时也降低了 insert 及 update 的效率,因为 insert 或 update 时有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定。一个表的索引数最好不要超过6个,若太多则应考虑一些不常使用到的列上建的索引是否有 必要。16. 应尽可能的避免更新 clustered 索引数据列,因为 clustered 索引数据列的顺序就是表记录的物理存储顺序,一旦该列值改变将导致整个表记录的顺序的调整,会耗费相当大的资源。若应用系统需要频繁更新 clustered 索引数据列,那么需要考虑是否应将该索引建为 clustered 索引。17.尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和连接时会逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。18.尽可能的使用 varchar/nvarchar 代替 char/nchar ,因为首先变长字段存储空间小,可以节省存储空间,其次对于查询来说,在一个相对较小的字段内搜索效率显然要高些。19.任何地方都不要使用 select * from t ,用具体的字段列表代替“*”,不要返回用不到的任何字段。20.尽量使用表变量来代替临时表。如果表变量包含大量数据,请注意索引非常有限(只有主键索引)。21.避免频繁创建和删除临时表,以减少系统表资源的消耗。22.临时表并不是不可使用,适当地使用它们可以使某些例程更有效,例如,当需要重复引用大型表或常用表中的某个数据集时。但是,对于一次性事件,最好使用导出表。23.在新建临时表时,如果一次性插入数据量很大,那么可以使用 select into 代替 create table,避免造成大量 log ,以提高速度;如果数据量不大,为了缓和系统表的资源,应先create table,然后insert。24.如果使用到了临时表,在存储过程的最后务必将所有的临时表显式删除,先 truncate table ,然后 drop table ,这样可以避免系统表的较长时间锁定。25.尽量避免使用游标,因为游标的效率较差,如果游标操作的数据超过1万行,那么就应该考虑改写。26.使用基于游标的方法或临时表方法之前,应先寻找基于集的解决方案来解决问题,基于集的方法通常更有效。27. 与临时表一样,游标并不是不可使 用。对小型数据集使用 FAST_FORWARD 游标通常要优于其他逐行处理方法,尤其是在必须引用几个表才能获得所需的数据时。在结果集中包括“合计”的例程通常要比使用游标执行的速度快。如果开发时 间允许,基于游标的方法和基于集的方法都可以尝试一下,看哪一种方法的效果更好。28.在所有的存储过程和触发器的开始处设置 SET NOCOUNT ON ,在结束时设置 SET NOCOUNT OFF 。无需在执行存储过程和触发器的每个语句后向客户端发送DONE_IN_PROC 消息。29.尽量避免大事务操作,提高系统并发能力。30.尽量避免向客户端返回大数据量,若数据量过大,应该考虑相应需求是否合理。
阅读(9413)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
在LOFTER的更多文章
loftPermalink:'',
id:'fks_',
blogTitle:'提高mysql千万级大数据SQL查询优化30条经验(Mysql索引优化注意)',
blogAbstract:'转自:/archives/120/1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。',
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:0,
publishTime:4,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:3,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'',
hmcon:'1',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}答案:解析:
  (1)AB
  (2)ABCD
  (3)低工资的不发达,高工资的发达,不发达地区劳动力和地价低廉,生产成本低,企业可以获得相对较高的效益。
  (4)先进的技术和管理经验
  (5)环境恶化、地价昂贵、交通堵塞、生活费用高、生产成本高
  (6)大学生去西部属脑力迁移,给西部开发提供技术支持,其与图中的劳务输出不一样。
请在这里输入关键词:
科目:高中地理
来源:安徽省宿州市2012届高三第一次教学质量检测地理试题
阅读下列材料,回答问题。
  材料一 黄河三角洲略图(上图)和珠江三角洲略图(下图)
  材料二 黄河三角洲从十九世纪中后期开始形成,黄河三角洲湿地是世界上暖温带保存最广阔、最完善、最年轻的湿地生态系统,是东北亚与环西太平洋地区侯鸟迁徒的中转站。二十世纪末,该湿地一度萎缩并遭到破坏,水质变差。
  材料三 珠江三角洲是我国重要的工业基地,近年来,该地一部分劳动力密集型和资源密集型企业向内地的边远地区转移,并在本省边缘地区产生集群效应。
  材料四 长江三角洲与珠江三角洲2003年经济指标比较表
(1)到二十世纪末,黄河三角洲湿地发生了哪些变化,其原因可能有哪些?
(2)与长江、珠江相比,黄河河口地区为什么没有形成大城市?
(3与长江三角洲相比,珠江三角洲单位GDP能耗较低,根据资料并应用所学知识分析其主要原因。
(4)从珠扛三角洲工业区位条件的变化,分析该地区劳动密集型产业和资源密集型产业向周边地区转移的原因。
科目:高中地理
&(2010·天津高考)天津滨海地区已形成综合性工业地域。下图所示工业部门集聚的主要原因,是共同利用了天津滨海地区的(  )
A.原料& &&&&&&&&&&&&&&&&&& B.基础设施
C.燃料& &&&&&&&&&&&&&&&&&& D.消费市场
所谓产业集群,是指在地理上靠近,同处或相关于一个特定产业领域的中小企业,高密度地聚集在一起。未来的世界竞争,很大程度上将是产业集群的竞争。运用所学知识回答2~3题
2.从产业联系看,在“纺织业集群地”布局可能性最小的是(  )
A.化纤厂& &&&&&&&&&&&&&&&& B.织布厂
C.印染厂& &&&&&&&&&&&&&&&& D.造船厂
科目:高中地理
来源:学年四川省凉山州高三第二次诊断性测试地理试卷(解析版)
题型:综合题
读图和材料,回答下列问题。(30分)
& 材料一 进入本世纪以来,西南地区的水电梯级开发大规模启动,各主要河流开发规划如下:金沙江中下游12级,雅砻江干流21级,澜沧江计划在云南境内搞14级。而以上河流的各级支流水电站规划建设更是“密如繁星”。壮丽河流,正在被一座座大坝拦腰截断。
& 材料二 凉山州是我国著名的优质高山苦荞生产基地。上世纪末本世纪初当地科技人员以苦荞为原料研制成功了苦荞茶系列饮品。经过十多年的发展,形成了以西昌市为中心集研制开发、生产销售一体化的二十多个著名苦荞茶品牌企业,产品远销国内外。带动了当地苦荞种植和苦荞茶加工业的迅速发展。
(1)简要描述凉山州的地形地势特征。(6分)
(2)简述西南地区大现模水电开发可能对自然灾害和生态环境带来的不利影响。(6分)
(3)分析近十多年来凉山苦荞茶产业迅速发展壮大的区位因素。(10分)
(4)森林火险是森林火灾发生的可能性和蔓延难易程度的一种重要度量指标,等级越高越容易发生森林火灾。凉山州森林资源丰富,但森林火灾对丰富的森林资源构成了极大威胁。据材料三推测凉山州森林火险等级高的季节并说出判断理由。(8分)
科目:高中地理
近年来,我国钢铁企业开始了合并重组和搬迁的浪潮,如济钢和莱钢合并重组成山东钢铁集团、武钢和柳钢重组并在广西防城港建设钢铁基地、宝钢集团在湛江建设钢铁基地、首钢逐渐向曹妃甸搬迁等。据此回答24~25题。
24.下面对我国钢铁企业合并重组的说法,不正确的是(  )
A.有利于实现我国钢铁企业效益的最大化
B.有利于我国钢铁企业增加在国际市场上谈判的话语权
C.有利于我国钢铁产业向集群化发展,优化产业结构
D.不利于钢铁企业产业链向纵深发展,影响钢铁企业产品附加值的提高
25.我国钢铁企业向沿海搬迁的战略目的是(  )
A.利用廉价的劳动力资源,降低人力成本  B.接近原料产地,减小运输成本
C.与内地相比,沿海地区技术力量雄厚  & D.利用海运优势,便于原料、产品运输
科目:高中地理
近年来,我国钢铁企业开始了合并重组和搬迁的浪潮,如济钢和莱钢合并重组成山东钢铁集团、武钢和柳钢重组并在广西防城港建设钢铁基地、宝钢集团在湛江建设钢铁基地、首钢逐渐向曹妃甸搬迁等。据此回答3~4题。
3.下面对我国钢铁企业合并重组的说法,不正确的是(  )
A.有利于实现我国钢铁企业效益的最大化
B.有利于我国钢铁企业增加在国际市场上谈判的话语权
C.有利于我国钢铁产业向集群化发展,优化产业结构
D.不利于钢铁企业产业链向纵深发展,影响钢铁企业产品附加值的提高
4.我国钢铁企业向沿海搬迁的战略目的是(  )
A.利用廉价的劳动力资源,降低人力成本
B.接近原料产地,减小运输成本
C.与内地相比,沿海地区技术力量雄厚
D.利用海运优势,便于原料、产品运输普通表与临时表DML操作会产生REDO/UNDO对比与分析 - Oracle数据库栏目 - 红黑联盟
普通表与临时表DML操作会产生REDO/UNDO对比与分析
普通表与临时表DML操作会产生REDO/UNDO对比与分析
ORACLE临时表介绍:
ORACLE除了可以保存永久表外,还可以建立临时表temporary tables。这些临时表用来保存一个会话SESSION的数据,或者保存在一个事务中需要的数据。当会话退出或者用户提交commit和回滚rollback事务的时候,临时表的数据自动清空,但是临时表的结构以及元数据还存储在用户的数据字典中。
Oracle临时表分为 会话级临时表 和 事务级临时表。
会话级临时表是指临时表中的数据只在会话生命周期之中存在,当用户退出会话结束的时候,Oracle自动清除临时表中数据。
事务级临时表是指临时表中的数据只在事务生命周期中存在。当一个事务结束(commit or rollback),Oracle自动清除临时表中数据。
临时表中的数据只对当前Session有效,每个Session都有自己的临时数据,并且不能访问其它Session的临时表中的数据。因此,临时表不需要DML锁。
&当一个会话结束(用户正常退出 用户不正常退出 ORACLE实例崩溃)或者一个事务结束的时候,Oracle对这个会话的表执行 TRUNCATE 语句清空临时表数据.但不会清空其它会话临时表中的数据.可以索引临时表和在临时表基础上建立视图.同样,建立在临时表上的索引也是临时的,也是只对当前会话或者事务有效. & 临时表可以拥有触发器.
全文的REDO/UNOD大小的单位均为BYTES。
一、环境及用户
BYS@bys1&select * from v$
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
PL/SQL Release 11.2.0.1.0 - Production
CORE & &11.2.0.1.0 & & &Production
TNS for Linux: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production
BYS@bys1&select force_logging from v$
BYS@bys1&select * from user_role_&
USERNAME & & & & & & & & & & & GRANTED_ROLE & & & & & & & & & ADM DEF OS_
------------------------------ ------------------------------ --- --- ---
BYS & & & & & & & & & & & & & &DBA & & & & & & & & & & & & & &NO &YES NO
BYS@bys1&select *
TNAME & & & & & & & & & & & & &TABTYPE &CLUSTERID
------------------------------ ------- ----------
DEPT & & & & & & & & & & & & & TABLE
EMP & & & & & & & & & & & & & &TABLE
SYS_TEMP_FBT & & & & & & & & & TABLE
创建一个表,600W条数据--源数据为dba_objects,通过多次查询插入。
BYS@bys1&create table test9 as select * from dba_
Table created.
BYS@bys1&insert into test9 select * from test9; & ---多次使用此语句插入数据
Commit complete.
BYS@bys1&select count(*) from test9; & 将近700W条。
& COUNT(*)
----------
& &6957120
#########################################
二、创建一个普通表,并统计建表及插入数据等操作所产生的REDO及UNDO大小
注:其中每一步后的查看REDO及UNDO大小我都查询了好几遍,节约篇幅未列出;并且测试系统上只有此客户端在数据库环境中进行操作。
建表前后的REDO/UNDO大小变化
BYS@bys1&select name,value as bytes from (select b.name,a.value from v$mystat a,v$statname b where a.STATISTIC#=b.statisti) where &name='redo size' or name like 'undo change%';
NAME & & & & & & & & & & & & & & & & & & & & & & & & & & & & BYTES
---------------------------------------------------------------- ----------
redo size & & & & & & & & & & & & & & & & & & & & & & & & & & 1824
undo change vector size & & & & & & & & & & & & & & & &188
BYS@bys1&create table test1 as select * from test9 where 1=0;
Table created.
BYS@bys1&select name,value as bytes from (select b.name,a.value from v$mystat a,v$statname b where a.STATISTIC#=b.statistic#) where &name='redo size' or name like 'undo change%';
NAME & & & & & & & & & & & & & & & & & & & & & & & & & & & & BYTES
---------------------------------------------------------------- ----------
redo size & & & & & & & & & & & & & & & & & & & & & & & & & 238604
undo change vector size & & & & & & & & & & & & & & & & & & & 6924
插入数据前后的REDO/UNDO大小变化
BYS@bys1&insert into test1 select * from test9; & &---需要时间较长,我这里用了8分半。
6957120 rows created.
Elapsed: 00:08:26.37
BYS@bys1&select name,value as bytes from (select b.name,a.value from v$mystat a,v$statname b where a.STATISTIC#=b.statistic#) where &name='redo size' or name like 'undo change%';
NAME & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &BYTES
---------------------------------------------------------------- ----------
redo size & & & & & & & & & & & & & & & & & & & & & & & & & & & &
undo change vector size & & & & & & & & & & & & & & & & & & & & & &
提交前后的REDO/UNDO大小变化
Commit complete.
Elapsed: 00:00:00.05
BYS@bys1&select name,value as bytes from (select b.name,a.value from v$mystat a,v$statname b where a.STATISTIC#=b.statistic#) where &name='redo size' or name like 'undo change%';
NAME & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &BYTES
---------------------------------------------------------------- ----------
redo size & & & & & & & & & & & & & & & & & & & & & & & & & & & &
undo change vector size & & & & & & & & & & & & & & & & & & & & & &
查询前后的REDO/UNDO大小变化:
第一次查询产生REDO是因为延迟块清除:
BYS@bys1&set autotrace on
BYS@bys1&select count(*) from test1;
& COUNT(*)
----------
& &6957120
Elapsed: 00:01:38.73
Execution Plan
----------------------------------------------------------
Plan hash value:
--------------------------------------------------------------------
| Id &| Operation & & & & &| Name &| Rows &| Cost (%CPU)| Time & & |
--------------------------------------------------------------------
| & 0 | SELECT STATEMENT & | & & & | & & 1 | 26827 & (1)| 00:05:22 |
| & 1 | &SORT AGGREGATE & &| & & & | & & 1 | & & & & & | & |
| & 2 | & TABLE ACCESS FULL| TEST1 | &7495K| 26827 & (1)| 00:05:22 |
--------------------------------------------------------------------
& &- dynamic sampling used for this statement (level=2)
Statistics
----------------------------------------------------------
& & & & &29 &recursive calls
& & & & & 1 &db block gets
& & &198000 &consistent gets
& & & 99253 &physical reads
& & & &5000 &redo size
& & & & 425 &bytes sent via SQL*Net to client
& & & & 419 &bytes received via SQL*Net from client
& & & & & 2 &SQL*Net roundtrips to/from client
& & & & & 0 &sorts (memory)
& & & & & 0 &sorts (disk)
& & & & & 1 &rows processed
BYS@bys1&set autotrace off
BYS@bys1&select name,value as bytes from (select b.name,a.value from v$mystat a,v$statname b where a.STATISTIC#=b.statistic#) where &name='redo size' or name like 'undo change%';
NAME & & & & & & & & & & & & & & & & & & & & & & & & & & & & BYTES
---------------------------------------------------------------- ----------
redo size & & & & & & & & & & & & & & & & & & & & & & & &
undo change vector size & & & & & & & & & & & & & & & & &
正常查询并没有产生REDO和UNDO
BYS@bys1&select count(*) from test1;
& COUNT(*)
----------
& &6957120
Elapsed: 00:00:26.95
BYS@bys1&select name,value as bytes from (select b.name,a.value from v$mystat a,v$statname b where a.STATISTIC#=b.statistic#) where &name='redo size' or name like 'undo change%';
NAME & & & & & & & & & & & & & & & & & & & & & & & & & & & & BYTES
---------------------------------------------------------------- ----------
redo size & & & & & & & & & & & & & & & & & & & & & & & &
undo change vector size & & & & & & & & & & & & & & & & &
统计情况如下:
create table test1 as select * from dba_objects where 1=0;语句:产生REDO/UNDO分别为: 236780 & & & 6736
insert into test1 select * from dba_语句:产生REDO/UNDO分别为:
COMMIT语句:产生REDO/UNDO分别为:236和0
三、创建一个ON COMMIT DELETE ROWS &临时表,并统计建表及插入数据等操作所产生的REDO及UNDO大小
PRESERVE ROWS临时表中的测试和ON COMMIT DELETE ROWS结果类似,不再重复贴了。
在上一步做完后退出SQLPLUS再登陆进行操作。
建表前后的REDO/UNDO大小变化
BYS@bys1&select name,value as bytes from (select b.name,a.value from v$mystat a,v$statname b where a.STATISTIC#=b.statistic#) where &name='redo size' or name like 'undo change%';
NAME & & & & & & & & & & & & & & & & & & & & & & & & & & & & BYTES
---------------------------------------------------------------- ----------
redo size & & & & & & & & & & & & & & & & & & & & & & & & & & 1956
undo change vector size & & & & & & & & & & & & & & & &164
BYS@bys1&create global temporary table temp1 on commit delete rows &as select * from test9 where 1=0;
Table created.
BYS@bys1&select name,value as bytes from (select b.name,a.value from v$mystat a,v$statname b where a.STATISTIC#=b.statistic#) where &name='redo size' or name like 'undo change%';
NAME & & & & & & & & & & & & & & & & & & & & & & & & & & & & BYTES
---------------------------------------------------------------- ----------
redo size & & & & & & & & & & & & & & & & & & & & & & & & & &26404
undo change vector size & & & & & & & & & & & & & & & & & & & 6692
插入数据前后的REDO/UNDO大小变化
BYS@bys1&insert into temp1 select * from test9;
6957120 rows created.
BYS@bys1&select name,value as bytes from (select b.name,a.value from v$mystat a,v$statname b where a.STATISTIC#=b.statistic#) where &name='redo size' or name like 'undo change%';
NAME & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &BYTES
---------------------------------------------------------------- ----------
redo size & & & & & & & & & & & & & & & & & & & & & & & & & & & & &
undo change vector size & & & & & & & & & & & & & & & & & & & & & &
BYS@bys1&select count(*) from temp1;
& COUNT(*)
----------
& &6957120
BYS@bys1&select name,value as bytes from (select b.name,a.value from v$mystat a,v$statname b where a.STATISTIC#=b.statistic#) where &name='redo size' or name like 'undo change%';
NAME & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &BYTES
---------------------------------------------------------------- ----------
redo size & & & & & & & & & & & & & & & & & & & & & & & & & & & & &
undo change vector size & & & & & & & & & & & & & & & & & & & & & &
提交前后的REDO/UNDO大小变化
Commit complete.
BYS@bys1&select name,value as bytes from (select b.name,a.value from v$mystat a,v$statname b where a.STATISTIC#=b.statistic#) where &name='redo size' or name like 'undo change%';
NAME & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &BYTES
---------------------------------------------------------------- ----------
redo size & & & & & & & & & & & & & & & & & & & & & & & & & & & & &
undo change vector size & & & & & & & & & & & & & & & & & & & & & &
查询前后的REDO/UNDO大小变化:--无变化
BYS@bys1&select count(*) from temp1;
& COUNT(*)
----------
& & & & &0
BYS@bys1&select name,value as bytes from (select b.name,a.value from v$mystat a,v$statname b where a.STATISTIC#=b.statistic#) where &name='redo size' or name like 'undo change%';
NAME & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &BYTES
---------------------------------------------------------------- ----------
redo size & & & & & & & & & & & & & & & & & & & & & & & & & & & & &
undo change vector size & & & & & & & & & & & & & & & & & & & & & &
统计情况如下:
create global temporary table temp1语句: 产生REDO和UNDO分别为: 24448 & & & 6528
insert into temp1 select * from dba_语句:产生REDO和UNDO分别为: & & &
COMMIT语句:产生REDO/UNDO分别为: 1346 &和0
四:两次操作产生的REDO/UNDO大小对比
普通表统计情况如下:
create table test1 as select * from dba_objects where 1=0;语句:产生REDO/UNDO分别为: 236780 & & & 6736
insert into test1 select * from dba_语句:产生REDO/UNDO分别为:
约775.99M &
COMMIT语句:产生REDO/UNDO分别为:236和0
ON COMMIT DELETE ROWS &临时表统计情况如下:
create global temporary table temp1语句: 产生REDO和UNDO分别为: 24448 & & & 6528
insert into temp1 select * from dba_语句:产生REDO和UNDO分别为: 约41M & & &
COMMIT语句:产生REDO/UNDO分别为: 1346 &和0
总结:临时表的建立和插入数据也产生REDO和UNDO。
建立临时表时因为修改了数据字典所以产生了少量REDO与UNDO;
提交时是在REDO中插入一条提交的标签,所以只产生少量REDO。
那么在插入数据时,临时表还是会产生REDO和UNDO,但是REDO量比普通表插入相同数据量时产生的REDO少很多,UNDO大小相近,这个是怎么解呢?
大致是因为:临时表产生了undo,而undo的变化又产生了REDO LOG, 所以临时表的DML操作也产生了REDO。
但是临时表产生的REDO的大小却比普通表DML操作的小,是因为临时表中不记录表中数据变化所产生的REDO,只记录了UNDO数据变化所产生的REDO。

我要回帖

更多关于 sql 临时表 索引 的文章

 

随机推荐