本文共 17469 字,大约阅读时间需要 58 分钟。
Purpose
Use the deallocate_unused_clause to explicitly deallocate unused space at the end of a database object segment and make the space available for other segments in the tablespace.
You can deallocate unused space using the following statements:
ALTER CLUSTER (see )
ALTER INDEX: to deallocate unused space from the index, an index partition, or an index subpartition (see )
ALTER MATERIALIZED VIEW: to deallocate unused space from the overflow segment of an index-organized materialized view (see )
ALTER TABLE: to deallocate unused space from the table, a table partition, a table subpartition, the mapping table of an index-organized table, the overflow segment of an index-organized table, or a LOB storage segment (see )
Syntax
deallocate_unused_clause::=
()
Semantics
This section describes the semantics of the deallocate_unused_clause. For additional information, refer to the SQL statement in which you set or reset this clause for a particular database object.
You cannot specify both the deallocate_unused_clause and the allocate_extent_clause in the same statement.
Oracle Database frees only unused space above the high water mark (that is, the point beyond which database blocks have not yet been formatted to receive data). Oracle deallocates unused space beginning from the end of the object and moving toward the beginning of the object to the high water mark.
If an extent is completely contained in the deallocation, then the whole extent is freed for reuse. If an extent is partially contained in the deallocation, then the used part up to the high water mark becomes the extent, and the remaining unused space is freed for reuse.
Oracle credits the amount of the released space to the user quota for the tablespace in which the deallocation occurs.
The exact amount of space freed depends on the values of the INITIAL, MINEXTENTS, and NEXT storage parameters. Please refer to the for a description of these parameters.
KEEP integer
Specify the number of bytes above the high water mark that the segment of the database object is to have after deallocation.
If you omit KEEP and the high water mark is above the size of INITIAL and MINEXTENTS, then all unused space above the high water mark is freed. When the high water mark is less than the size of INITIAL or MINEXTENTS, then all unused space above MINEXTENTS is freed.
If you specify KEEP, then the specified amount of space is kept and the remaining space is freed. When the remaining number of extents is less thanMINEXTENTS, then Oracle adjusts MINEXTENTS to the new number of extents. If the initial extent becomes smaller than INITIAL, then Oracle adjusts INITIALto the new size.
In either case, Oracle sets the value of the NEXT storage parameter to the size of the last extent that was deallocated.
How to efficiently drop a table with many extentsPURPOSE~~~~~~~ This note describes why a user process can consume large amounts of CPU after dropping a table consisting of many extents, and a potential workaround to stop the problem occurring. Essentially the CPU is being used to manipulate the extents i.e. moving used extents (uet$) to free extents (fet$). In certain circumstances it may be possible to regulate this CPU activity.SCOPE & APPLICATION~~~~~~~~~~~~~~~~~~~This article is intended to assist DBAs who may need to drop a tableconsisting of many extents.RELATED DOCUMENTS~~~~~~~~~~~~~~~~~Note:61997.1 SMON - Temporary Segment Cleanup and Free Space CoalescingPermanent object cleanup~~~~~~~~~~~~~~~~~~~~~~~~ If a permanent object (table) is made up of many extents, and the object is to be dropped, the user process dropping the object will consume large amounts of CPU - this is an inescapable fact. However, with some forethought it is possible to mitigate the effects of CPU usage (and hence the knock-on effect on other users of system resources) thus: 1. Identify, but do NOT drop the table 2. Truncate the table, specifying the REUSE STORAGE clause. This will be quick as extents are not deallocated; the highwater mark is simply adjusted to the segment header block. 3. Deallocate unused extents from the table, SPECIFYING THE KEEP CLAUSE. This is the crux - you can control how many extents are to be deallocated by specifying how much (in terms of Kb or Mb) of the table is NOT to be deallocated. Example: o. Table BIGTAB is 2Gb in size and consists of 262144 8Kb extents o. There is little CPU power available, and (from past experience) it is known that dropping an object of this number of extents can take days o. The system is quiet at night times (no other users or batch jobs) In the above example the table could be dropped in 'phases' over the period of a few nights as follows: 1. Truncate the table, specifying the REUSE STORAGE clause: SQL> TRUNCATE TABLE BIGTAB REUSE STORAGE; 2. If it takes 3 days (72 hours) to drop the table, spread this out over 6 nights i.e. drop 1/3 Gb per night. This can be achieved in 6 (nightly) steps as follows: Night 1: SQL> ALTER TABLE BIGTAB DEALLOCATE UNUSED KEEP 1707M; (2Gb*5/6) Night 2: SQL> ALTER TABLE BIGTAB DEALLOCATE UNUSED KEEP 1365M; (2Gb*4/6) Night 3: SQL> ALTER TABLE BIGTAB DEALLOCATE UNUSED KEEP 1024M; (2Gb*3/6) Night 4: SQL> ALTER TABLE BIGTAB DEALLOCATE UNUSED KEEP 683M; (2Gb*2/6) Night 5: SQL> ALTER TABLE BIGTAB DEALLOCATE UNUSED KEEP 341M; (2Gb*1/6) Night 6: SQL> DROP TABLE BIGTAB; NOTE: If the table only needed truncating, no drop statement is needed here. The same method can be applied if LOB segments or indexes are involved. SQL> ALTER TABLE MODIFY LOB () DEALLOCATE UNUSED KEEP M; SQL> ALTER INDEX DEALLOCATE UNUSED KEEP M; Caveats~~~~~~~ o. If you have inadvertently tried to drop the table, this method will not work. This is because the drop will first convert the segment to a temporary segment, and only then start cleaning up the now temporary segment's extents. Thus, if the drop is interrupted, the temporary segment will now be cleaned up by SMON. o. This method will only work for table, lob and index segment types. o. This method will not work for segments bigger than 4gb in size due to unpublished bug: 1190939 -- ORA-3277 WHEN ISSUING AN ALTER TABLE DEALLOCATE UNUSED > 4G (fixed in 10g and higher)------------------------------------------------------------------------------- Oracle Support Services
怎么有效的drop 或者truncate 有大量extents的table?
来源于:
How To Efficiently Drop (or Truncate) A Table With Many Extents (文档 ID 68836.1)目的:
本文描述了为什么一个用户进程在drop 了一个含有大量extents的table之后消耗大量的cpu资源。并给出一个潜在的workaround以阻止该问题的发生。本质来说,CPU被用于对extents的管理(manipulate),比如moving used extents(uet$)到 free extents(fet$).在某种情况中,it may be possible to regulate this CPU activity.适用范围:
本文协助DBA处理 drop 掉很多extents的表。相关的文章:
Note:61997.1 SMON - Temporary Segment Cleanup and Free Space Coalescing永久对象的清理
如果一个永久对象(table)是由 很多extents组成的,并且该object被drop,drop 该object的用户进程将会消耗很多的CPU资源,
这是不可避免的事实(an inescapable fact)。但是,基于一些远见卓识(with some forethought), 可以减轻(mitigate)CPU的使用(and hence the knock-on effect on other users of system resources)1. Identify, but do NOT drop the table
2.使用 REUSE STORAGE子句来truncate 该表。这样会很快,因为相关的extents不会被释放。高水位线(highwater mark)被简单的调整到segment header block3. 使用KEEP子句来释放该table中未使用的extents。这是本步骤的关键所在--通过指定table中有多少extent不会被释放,你可以控制有多少extents被释放
举例:
o. Table BIGTAB is 2Gb in size and consists of 262144 8Kb extents o. There is little CPU power available, and (from past experience) it is known that dropping an object of this number of extents can take days o. The system is quiet at night times (no other users or batch jobs) 在上面的例子中,table可以分为几个阶段在几个晚上被drop1. Truncate the table, specifying the REUSE STORAGE clause: SQL> TRUNCATE TABLE BIGTAB REUSE STORAGE; 2. If it takes 3 days (72 hours) to drop the table, spread this out over 6 nights i.e. drop 1/3 Gb per night. This can be achieved in 6 (nightly) steps as follows: 注意:If the table only needed truncating, no drop statement is needed here. Night 1: SQL> ALTER TABLE BIGTAB DEALLOCATE UNUSED KEEP 1707M; (2Gb*5/6) Night 2: SQL> ALTER TABLE BIGTAB DEALLOCATE UNUSED KEEP 1365M; (2Gb*4/6) Night 3: SQL> ALTER TABLE BIGTAB DEALLOCATE UNUSED KEEP 1024M; (2Gb*3/6) Night 4: SQL> ALTER TABLE BIGTAB DEALLOCATE UNUSED KEEP 683M; (2Gb*2/6) Night 5: SQL> ALTER TABLE BIGTAB DEALLOCATE UNUSED KEEP 341M; (2Gb*1/6) Night 6: SQL> DROP TABLE BIGTAB; 相同的方法也适用于LOB segments和index segment SQL> ALTER TABLE MODIFY LOB () DEALLOCATE UNUSED KEEP M; SQL> ALTER INDEX DEALLOCATE UNUSED KEEP M;
警告(caveats): o.如果你无意之间使用了drop 命令,本方法就不适用了。这是因为,drop table 会首先convert segment到一个临时segment,and only then start cleaning up the now temporary segment's extents.Thus, if the drop is interrupted, the temporary segment will now be cleaned up by SMON. o.This method will only work for table, lob and index segment types. o.This method will not work for segments bigger than 4gb in size due to unpublished bug: 1190939 -- ORA-3277 WHEN ISSUING AN ALTER TABLE DEALLOCATE UNUSED > 4G (fixed in 10g and higher)
In this Document
AWR reports following wait events in the TOP 5 Foreground Waits:
Top 5 Timed Foreground Events
~~~~~~~~~~~~~~~~~~~~~~~~~~ Event Waits Time(s) Avg wait (ms) % DB time Wait Class <snip> local write wait 493,380 1,585 3 11.78 User I/O DFS lock handle 1,200,205 692 1 5.14 Other enq: RO - fast object reuse 568,667 650 1 4.83 Application
The AWR Dictionary Cache Stats shows the following information:
The ASH reports the following statements that had waits listed in Top wait events:
Top SQL with Top Events
~~~~~~~~~~~~~~~~~~~~~~~~~ Sampled # SQL ID Planhash of Executions % Activity Event % Event Top Row Source % RwSrc SQL Text 7a62909337ud7 2452080186 1761 18.83 local write wait 5.81 DDL STATEMENT 5.81 TRUNCATE TABLE ... CPU + Wait for CPU 4.47 DDL STATEMENT 3.82 DFS lock handle 2.33 DDL STATEMENT 2.33 6tjfm0rv28q7p 348574753 785 8.43 local write wait 2.49 DDL STATEMENT 2.49 TRUNCATE TABLE ... CPU + Wait for CPU 1.66 DDL STATEMENT 1.22 DFS lock handle 1.45 DDL STATEMENT 1.45
Issue is caused by
TRUNCATE PARTITIONED TABLE SLOWER IN 11G THAN ON 10GThis issue occurs on 11.2.0.3 and higher, and its caused by a regression introduced by the fix for un-published Bug 11856377, which was included in the 11.2.0.3 patchset.Another symptom of this bug is the much more frequent access to dc_segments.
Bug is fixed in 12.1.0.2.
For versions 11.2.0.3, 11.2.0.4 and 12.1.0.1:
Download and apply for the appropriate platform/version .About Me
...............................................................................................................................
● 本文整理自网络
● 本文在itpub()、博客园()和个人微信公众号()上有同步更新
● 本文itpub地址:
● 本文博客园地址:
● 本文pdf版及小麦苗云盘地址:
● 数据库笔试面试题库及解答:
● QQ群:230161599 微信群:私聊
● 联系我请加QQ好友(646634621),注明添加缘由
● 于 2017-06-02 09:00 ~ 2017-06-30 22:00 在魔都完成
● 文章内容来源于小麦苗的学习笔记,部分整理自网络,若有侵权或不当之处还请谅解
● 版权所有,欢迎分享本文,转载请保留出处
...............................................................................................................................
拿起手机使用微信客户端扫描下边的左边图片来关注小麦苗的微信公众号:xiaomaimiaolhr,扫描右边的二维码加入小麦苗的QQ群,学习最实用的数据库技术。