drop与truncate的区别
来源:互联网 发布:电脑连不上网络怎么办 编辑:程序博客网 时间:2024/05/16 07:03
公司有同事清除大表的时候先truncate,然后drop。问为什么不直接drop,答这样效率高,那真的高吗?其实差不多,先测量下redo,drop 比truncate产生的还少,重点是标黄部分。
产生redo 执行时间
truncate 53k 00: 00: 01.06
drop 26k 00: 00: 00.28
SQL> create table test as select * from dba_objects;
SQL> select value
2 from v$mystat, v$statname
3 where v$mystat.statistic# =v$statname.statistic#
4 and v$statname.name ='redo size';
VALUE
----------
94912
SQL> truncate table test;
Table truncated
SQL> select value
2 from v$mystat, v$statname
3 where v$mystat.statistic# =v$statname.statistic#
4 and v$statname.name ='redo size';
VALUE
----------
149588
SQL> select (149588-94912)/1024 from dual;
(149588-94912)/1024
-------------------
53.39453125
SQL> drop table test purge;
Table dropped
SQL> select value
2 from v$mystat, v$statname
3 where v$mystat.statistic# =v$statname.statistic#
4 and v$statname.name ='redo size';
VALUE
----------
168404
SQL> create table test as select * from dba_objects;
Table created
SQL> select value
2 from v$mystat, v$statname
3 where v$mystat.statistic# =v$statname.statistic#
4 and v$statname.name ='redo size';
VALUE
----------
263320
SQL> drop table test purge;
Table dropped
SQL> select value
2 from v$mystat, v$statname
3 where v$mystat.statistic# =v$statname.statistic#
4 and v$statname.name ='redo size';
VALUE
----------
290364
SQL> select (290364-263320)/1024 from dual;
(290364-263320)/1024
--------------------
26.41015625
用10046跟踪truncate 和drop后台在做什么事情(为了造数据方便,用的不是test表),都是对数据字典的操作。
update语句数量 delete语句数量 insert语句数量
drop 2 45 0
truncate 7 6 1
drop table prod_runlog2 purge 10046产生的结果,剔除select语句:
drop table prod_runlog2 purge---------------------------------------------------------BEGIN BEGIN IF (xdb.DBMS_XDBZ0.is_hierarchy_enabled_internal(sys.dictionary_obj_owner, sys.dictionary_obj_name, sys.dictionary_obj_owner)) THEN xdb.XDB_PITRIG_PKG.pitrig_truncate(sys.dictionary_obj_owner, sys.dictionary_obj_name); END IF; EXCEPTION WHEN OTHERS THEN null; END; BEGIN IF (xdb.DBMS_XDBZ0.is_hierarchy_enabled_internal(sys.dictionary_obj_owner, sys.dictionary_obj_name, sys.dictionary_obj_owner, xdb.DBMS_XDBZ.IS_ENABLED_RESMETADATA)) THEN xdb.XDB_PITRIG_PKG.pitrig_dropmetadata(sys.dictionary_obj_owner, sys.dictionary_obj_name); END IF; EXCEPTION WHEN OTHERS THEN null; END;END;---------------------------------------------------------declare stmt varchar2(200); rdf_exception EXCEPTION; pragma exception_init(rdf_exception, -20000);BEGIN if dictionary_obj_type = 'USER' THEN BEGIN EXECUTE IMMEDIATE 'begin ' || 'mdsys.rdf_apis_internal.' || 'notify_drop_user(''' || dictionary_obj_name || '''); ' || 'end;'; EXCEPTION WHEN rdf_exception THEN RAISE; WHEN OTHERS THEN NULL; END; end if;end;---------------------------------------------------------delete from object_usage where obj# in (select a.obj# from object_usage a, ind$ b where a.obj# = b.obj# and b.bo# = :1)---------------------------------------------------------delete from sys.cache_stats_1$ where dataobj# = :1---------------------------------------------------------delete com$ where obj#=:1---------------------------------------------------------delete from hist_head$ where obj# = :1---------------------------------------------------------delete from dependency$ where d_obj#=:1---------------------------------------------------------delete from source$ where obj#=:1---------------------------------------------------------DELETE FROM sys.sumdelta$ sd WHERE sd.tableobj# = :1---------------------------------------------------------DELETE FROM sys.sumpartlog$ sp WHERE sp.bo# = :1---------------------------------------------------------DELETE FROM sys.snap_loadertime$ sd WHERE sd.tableobj# = :1---------------------------------------------------------BEGIN aw_drop_proc(ora_dict_obj_type, ora_dict_obj_name, ora_dict_obj_owner) ;END;---------------------------------------------------------declare stmt varchar2(200);BEGIN if dictionary_obj_type = 'USER' THEN stmt := 'DELETE FROM SDO_GEOM_METADATA_TABLE ' || ' WHERE ''"''||SDO_OWNER||''"'' = ''"' || dictionary_obj_name || '"'' '; EXECUTE IMMEDIATE stmt; stmt := 'DELETE FROM SDO_MAPS_TABLE ' || ' WHERE ''"''||SDO_OWNER||''"'' = ''"' || dictionary_obj_name || '"'' '; EXECUTE IMMEDIATE stmt; stmt := 'DELETE FROM SDO_STYLES_TABLE ' || ' WHERE ''"''||SDO_OWNER||''"'' = ''"' || dictionary_obj_name || '"'' '; EXECUTE IMMEDIATE stmt; stmt := 'DELETE FROM SDO_THEMES_TABLE ' || ' WHERE ''"''||SDO_OWNER||''"'' = ''"' || dictionary_obj_name || '"'' '; EXECUTE IMMEDIATE stmt; stmt := 'DELETE FROM SDO_LRS_METADATA_TABLE ' || ' WHERE ''"''||SDO_OWNER||''"'' = ''"' || dictionary_obj_name || '"'' '; EXECUTE IMMEDIATE stmt; stmt := 'DELETE FROM SDO_TOPO_METADATA_TABLE ' || ' WHERE ''"''||SDO_OWNER||''"'' = ''"' || dictionary_obj_name || '"'' '; EXECUTE IMMEDIATE stmt; end if;end;---------------------------------------------------------DECLARE type vcurType is REF CURSOR; vcur vcurType; stmt VARCHAR2(1000); stm2 VARCHAR2(200); rdt VARCHAR2(80); rsid number; cnt number;BEGIN IF dictionary_obj_type = 'USER' THEN stmt := 'DELETE FROM SDO_GEOR_SYSDATA_TABLE WHERE SDO_OWNER = :name'; EXECUTE IMMEDIATE stmt using dictionary_obj_name; ELSIF dictionary_obj_type = 'TABLE' AND dictionary_obj_owner <> 'MDSYS' AND dictionary_obj_name <> 'SDO_GEOR_SYSDATA_TABLE' THEN stmt := 'SELECT COUNT(*) FROM SDO_GEOR_SYSDATA_TABLE ' || ' WHERE SDO_OWNER = :1 AND GEORASTER_TABLE_NAME = :2'; EXECUTE IMMEDIATE stmt INTO cnt USING dictionary_obj_owner, dictionary_obj_name; IF cnt > 0 THEN stmt := 'SELECT RDT_TABLE_NAME, RASTER_ID FROM SDO_GEOR_SYSDATA_TABLE' || ' WHERE SDO_OWNER = :1 AND GEORASTER_TABLE_NAME = :2'; open vcur for stmt using dictionary_obj_owner, dictionary_obj_name; loop fetch vcur into rdt, rsid; exit when vcur%NOTFOUND; if instr(rdt, '.') = 0 then rdt := dictionary_obj_owner || '.' || rdt; end if; stm2 := 'DELETE FROM ' || rdt || ' WHERE rasterid=:1'; begin execute immediate stm2 using rsid; exception when others then if SQLCODE <> -942 then raise; end if; end; end loop; stmt := 'DELETE FROM SDO_GEOR_SYSDATA_TABLE ' || ' WHERE SDO_OWNER = :name AND GEORASTER_TABLE_NAME = :2'; EXECUTE IMMEDIATE stmt USING dictionary_obj_owner, dictionary_obj_name; END IF; END IF;END;---------------------------------------------------------DECLARE stmt VARCHAR2(256);BEGIN stmt := 'DELETE FROM SDO_NETWORK_METADATA_TABLE WHERE SDO_OWNER = :name'; IF dictionary_obj_type = 'USER' THEN EXECUTE IMMEDIATE stmt using NLS_UPPER(dictionary_obj_name); END IF;END ;---------------------------------------------------------DECLARE stmt VARCHAR2(256);BEGIN stmt := 'DELETE FROM SDO_NETWORK_CONSTRAINTS WHERE SDO_OWNER = :name'; IF dictionary_obj_type = 'USER' THEN EXECUTE IMMEDIATE stmt using NLS_UPPER(dictionary_obj_name); END IF;END ;---------------------------------------------------------DECLARE stmt VARCHAR2(256);BEGIN stmt := 'DELETE FROM SDO_NETWORK_USER_DATA WHERE SDO_OWNER = :name'; IF dictionary_obj_type = 'USER' THEN EXECUTE IMMEDIATE stmt using NLS_UPPER(dictionary_obj_name); END IF;END ;---------------------------------------------------------delete from idl_ub1$ where obj#=:1 and part=:2---------------------------------------------------------delete from idl_char$ where obj#=:1 and part=:2---------------------------------------------------------delete from idl_ub2$ where obj#=:1 and part=:2---------------------------------------------------------delete from idl_sb4$ where obj#=:1 and part=:2---------------------------------------------------------delete from ncomp_dll$ where obj#=:1 returning dllname into :2---------------------------------------------------------delete from objauth$ where obj#=:1---------------------------------------------------------delete from col$ where obj#=:1---------------------------------------------------------delete from icol$ where bo#=:1---------------------------------------------------------delete from icoldep$ where obj# in (select obj# from ind$ where bo#=:1)---------------------------------------------------------delete from jijoin$ where obj# in ( select obj# from jijoin$ where tab1obj# = :1 or tab2obj# = :1)---------------------------------------------------------delete from jirefreshsql$ where iobj# in ( select iobj# from jirefreshsql$ where tobj# = :1)---------------------------------------------------------delete from ccol$ where obj#=:1---------------------------------------------------------delete from ind$ where bo#=:1---------------------------------------------------------delete from cdef$ where obj#=:1---------------------------------------------------------delete from tab$ where obj#=:1---------------------------------------------------------delete coltype$ where obj#=:1---------------------------------------------------------delete from subcoltype$ where obj#=:1---------------------------------------------------------delete ntab$ where obj#=:1---------------------------------------------------------delete lob$ where obj#=:1---------------------------------------------------------select o.name from obj$ o, refcon$ r where o.oid$ = r.expctoid and r.obj# = :1---------------------------------------------------------delete refcon$ where obj#=:1---------------------------------------------------------delete from opqtype$ where obj#=:1---------------------------------------------------------update seg$ set type#=:4,blocks=:5,extents=:6,minexts=:7,maxexts=:8,extsize= :9,extpct=:10,user#=:11,iniexts=:12,lists=decode(:13, 65535, NULL, :13), groups=decode(:14, 65535, NULL, :14), cachehint=:15, hwmincr=:16, spare1= DECODE(:17,0,NULL,:17),scanhint=:18 where ts#=:1 and file#=:2 and block#=:3---------------------------------------------------------delete from obj$ where obj# = :1---------------------------------------------------------delete from con$ where owner#=:1 and name=:2---------------------------------------------------------update tsq$ set blocks=:3,maxblocks=:4,grantor#=:5,priv1=:6,priv2=:7,priv3=:8 where ts#=:1 and user#=:2---------------------------------------------------------delete from seg$ where ts#=:1 and file#=:2 and block#=:3---------------------------------------------------------
truncate table prod_runlog2 10046产生的结果,剔除select语句:
truncate table---------------------------------------------------------truncate table prod_runlog1BEGIN BEGIN IF (xdb.DBMS_XDBZ0.is_hierarchy_enabled_internal(sys.dictionary_obj_owner, sys.dictionary_obj_name, sys.dictionary_obj_owner)) THEN xdb.XDB_PITRIG_PKG.pitrig_truncate(sys.dictionary_obj_owner, sys.dictionary_obj_name); END IF; EXCEPTION WHEN OTHERS THEN null; END; BEGIN IF (xdb.DBMS_XDBZ0.is_hierarchy_enabled_internal(sys.dictionary_obj_owner, sys.dictionary_obj_name, sys.dictionary_obj_owner, xdb.DBMS_XDBZ.IS_ENABLED_RESMETADATA)) THEN xdb.XDB_PITRIG_PKG.pitrig_dropmetadata(sys.dictionary_obj_owner, sys.dictionary_obj_name); END IF; EXCEPTION WHEN OTHERS THEN null; END;END;--------------------------------------------------------- update obj$ set obj#=:6,type#=:7,ctime=:8,mtime=:9,stime=:10,status=:11, dataobj#=:13,flags=:14,oid$=:15,spare1=:16, spare2=:17 where owner#=:1 and name=:2 and namespace=:3 and(remoteowner=:4 or remoteowner is null and :4 is null)and(linkname=:5 or linkname is null and :5 is null) and(subname=:12 or subname is null and :12 is null) --------------------------------------------------------- update sys.mon_mods$ set inserts = inserts + :ins, updates = updates + :upd, deletes = deletes + :del, flags = (decode(bitand(flags, :flag), :flag, flags, flags + :flag)), drop_segments = drop_segments + :dropseg, timestamp = :time where obj# = :objn --------------------------------------------------------- insert into sys.mon_mods$ values (:1, :2, :3, :4, :5, :6, :7) --------------------------------------------------------- delete from tab_stats$ where obj#=:1 --------------------------------------------------------- update tab$ set ts#=:2,file#=:3,block#=:4,bobj#=decode(:5,0,null,:5),tab#= decode(:6,0,null,:6),intcols=:7,kernelcols=:8,clucols=decode(:9,0,null,:9), audit$=:10,flags=:11,pctfree$=:12,pctused$=:13,initrans=:14,maxtrans=:15, rowcnt=:16,blkcnt=:17,empcnt=:18,avgspc=:19,chncnt=:20,avgrln=:21, analyzetime=:22,samplesize=:23,cols=:24,property=:25,degree=decode(:26,1, null,:26),instances=decode(:27,1,null,:27),dataobj#=:28,avgspc_flb=:29, flbcnt=:30,trigflag=:31,spare1=:32,spare2=decode(:33,0,null,:33),spare4=:34, spare6=:35 where obj#=:1 --------------------------------------------------------- update seg$ set type#=:4,blocks=:5,extents=:6,minexts=:7,maxexts=:8,extsize= :9,extpct=:10,user#=:11,iniexts=:12,lists=decode(:13, 65535, NULL, :13), groups=decode(:14, 65535, NULL, :14), cachehint=:15, hwmincr=:16, spare1= DECODE(:17,0,NULL,:17),scanhint=:18 where ts#=:1 and file#=:2 and block#=:3 --------------------------------------------------------- update tsq$ set blocks=:3,maxblocks=:4,grantor#=:5,priv1=:6,priv2=:7,priv3=:8 where ts#=:1 and user#=:2 --------------------------------------------------------- DECLARE type vcurType is REF CURSOR; vcur vcurType; stmt VARCHAR2(1000); stm2 VARCHAR2(250); rdt VARCHAR2(80); rsid number; cnt number; m_id number;BEGIN IF dictionary_obj_type <> 'TABLE' THEN return; END IF; stmt := 'SELECT COUNT(*) FROM SDO_GEOR_SYSDATA_TABLE ' || ' WHERE SDO_OWNER = :1 AND GEORASTER_TABLE_NAME = :2'; EXECUTE IMMEDIATE stmt INTO cnt USING dictionary_obj_owner, dictionary_obj_name; IF cnt > 0 THEN stmt := 'SELECT RDT_TABLE_NAME, RASTER_ID FROM SDO_GEOR_SYSDATA_TABLE' || ' WHERE SDO_OWNER = :1 AND GEORASTER_TABLE_NAME = :2'; open vcur for stmt using dictionary_obj_owner, dictionary_obj_name; loop fetch vcur into rdt, rsid; exit when vcur%NOTFOUND; if instr(rdt, '.') = 0 then rdt := dictionary_obj_owner || '.' || rdt; end if; stm2 := 'DELETE FROM ' || rdt || ' WHERE rasterid=:1'; begin execute immediate stm2 using rsid; exception when others then if SQLCODE <> -942 then raise; end if; end; end loop; stmt := 'DELETE FROM SDO_GEOR_SYSDATA_TABLE ' || ' WHERE SDO_OWNER = :name AND GEORASTER_TABLE_NAME = :2'; EXECUTE IMMEDIATE stmt USING dictionary_obj_owner, dictionary_obj_name; END IF; stmt := 'SELECT COUNT(*) FROM ALL_TABLES ' || ' WHERE OWNER = ''MDSYS'' AND TABLE_NAME = ''RDF_MODEL$'' '; EXECUTE IMMEDIATE stmt INTO cnt; if (cnt = 1) then begin cnt := 0; stmt := 'SELECT count(*) FROM MDSYS.RDF_MODEL$ ' || ' WHERE OWNER = :1 AND TABLE_NAME = :2'; EXECUTE IMMEDIATE stmt INTO cnt USING dictionary_obj_owner, dictionary_obj_name; if (cnt > 0) then stmt := 'SELECT model_id FROM MDSYS.RDF_MODEL$ ' || ' WHERE OWNER = :1 AND TABLE_NAME = :2'; EXECUTE IMMEDIATE stmt INTO m_id USING dictionary_obj_owner, dictionary_obj_name; stmt := ' DELETE MDSYS.RDF_LINK$ WHERE model_id = '||to_char(m_id) ; EXECUTE IMMEDIATE stmt; end if; exception when others then NULL; end; end if;END; ---------------------------------------------------------
- drop与truncate的区别
- drop,truncate与delete的区别
- Delete与Truncate以及Drop的区别
- drop,truncate与delete的区别
- drop与truncate table 的区别*
- drop,truncate与delete的区别
- SQL truncate 、delete与drop的区别
- mysql delete,truncate与drop的区别
- drop,truncate与delete的区别
- truncate、delete与drop的区别
- truncate、delete与drop的区别
- 题目:drop,delete 与 truncate 的区别?
- SQL drop和truncate与drop的区别
- Truncate,delete与drop区别
- Truncate、delete与drop区别
- truncate 、delete与drop区别
- Truncate、Drop与Delete区别
- truncate 、delete与drop区别
- windows7下净化开始菜单
- jQuery对象和DOM对象相互转化
- jQuery选择器分类,总结
- 有趣的管理学故事
- 小妞会装机 -- 一个装机软件的开发笔记(五)
- drop与truncate的区别
- 编程基础 ( 3 )
- JqueryUI Autocomplete 自动补全实例
- hdu 1207 汉诺塔II
- 初始jquery
- codeforces 127D Password (后缀自动机 SAM)
- jQuery选择器分类
- Sciter2 之一:封装Sciter2到CWnd的子类中
- 记录CentOS 6.4上装Oracle 11g 的笔记