MOVE和CTAS比较


联系:手机(13429648788) QQ(107644445)QQ咨询惜分飞

标题:MOVE和CAST比较

作者:惜分飞©版权所有[未经本人同意,请不得以任何形式转载,否则有进一步追究法律责任的权利.]


1.创建模拟表

SQL> select * from v$version;
 
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
PL/SQL Release 11.2.0.3.0 - Production
CORE    11.2.0.3.0      Production
TNS for Linux: Version 11.2.0.3.0 - Production
NLSRTL Version 11.2.0.3.0 - Production
 
SQL> create table chf.t_xifenfei_move
   as
   select * from dba_objects;
 
Table created.
 
SQL> select count (*) from chf.t_xifenfei_move;
 
   COUNT (*)
----------
      73585
 
SQL> create table chf.t_xifenfei_move
   as
   select * from dba_objects;
 
Table created.
 
SQL> select count (*) from chf.t_xifenfei_move;
 
   COUNT (*)
----------
      73585
 
SQL> DECLARE
   2     i NUMBER;
   3      BEGIN
   4        FOR i IN 1..100 LOOP
   5          INSERT INTO chf.t_xifenfei_move
   6          select * from dba_objects;
   7          END LOOP;
   8          COMMIT ;
   9      END ;
  10      /
 
PL/SQL procedure successfully completed.
 
SQL> exec dbms_stats.gather_table_stats( 'CHF' , 'T_XIFENFEI_MOVE' );
 
PL/SQL procedure successfully completed.
 
SQL> select bytes from dba_segments where segment_name= 'T_XIFENFEI_MOVE' ;
 
      BYTES
----------
  872415232

2.测试move
2.1)执行move操作,记录时间

SQL> alter system flush buffer_cache;
 
System altered.
 
SQL> SET TIMING ON ;  
SQL> alter session set events
   '10046 trace name context forever,level 1' ;
 
Session altered.
 
Elapsed: 00:00:00.00
SQL> ALTER TABLE CHF.T_XIFENFEI_MOVE MOVE TABLESPACE USERS;
 
Table altered.
 
Elapsed: 00:02:11.77
SQL> alter session set events
   '10046 trace name context off' ;
 
Session altered.
 
Elapsed: 00:00:00.04
SQL> select d.value|| '/' || lower (rtrim(i.instance,chr(0)))|| '_ora_' ||p.spid|| '.trc' trace_file_name from
   2  ( select p.spid from v$mystat m, v$session s,v$process p where m.statistic# = 1 and s.sid = m.sid and p.addr = s.paddr ) p,
   3  ( select t.instance from v$thread t,v$parameter v where v. name = 'thread' and (v.value = 0 or t.thread# = to_number(v.value))) i,
   4  ( select value from v$parameter where name = 'user_dump_dest' ) d;
 
TRACE_FILE_NAME
--------------------------------------------------------------------------------
/opt/oracle/diag/rdbms/chf/chf/trace/chf_ora_4765.trc

从这里可以看出,move操作执行了00:02:11.77

2.2)查看trace内容

[oracle@node1 ~]$ tkprof  /opt/oracle/diag/rdbms/chf/chf/trace/chf_ora_4765 .trc /tmp/xifenfei_move .txt
 
TKPROF: Release 11.2.0.3.0 - Development on Tue Jan 10 10:57:59 2012
 
Copyright (c) 1982, 2011, Oracle and /or its affiliates.  All rights reserved.
 
 
 
********************************************************************************
 
SQL ID: c1yk5pv0v1wg1 Plan Hash: 2931676921
 
ALTER TABLE CHF.T_XIFENFEI_MOVE MOVE TABLESPACE USERS
 
 
call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1      0.00       0.05          7          8          0           0
Execute      1     11.29     131.23     105584     106275     115654     7432085
Fetch        0      0.00       0.00          0          0          0           0
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total        2     11.30     131.29     105591     106283     115654     7432085
 
Misses in library cache during parse: 1
Optimizer mode: ALL_ROWS
Parsing user id : SYS
Number of plan statistics captured: 1
 
Rows (1st) Rows (avg) Rows (max)  Row Source Operation
---------- ---------- ----------  ---------------------------------------------------
          0          0          0  LOAD AS SELECT  (cr=117799 pr =105602 pw=105585 time =131351005 us)
    7432085    7432085    7432085   TABLE ACCESS FULL T_XIFENFEI_MOVE (cr=105591 pr =105586 pw=0 time =4735560 us cost=23453 size=720912245 card=7432085)
 
********************************************************************************

从这里可以看出执行move,其实本质是全表扫描表,然后append方式插入数据,而不是真的数据块拷贝

3.测试CAST
3.1).CAST插入数据过程

SQL> alter system flush buffer_cache;

System altered.

SQL> SET TIMING ON;
SQL> alter session set events
2 ’10046 trace name context forever,level 1′;

Session altered.

Elapsed: 00:00:00.01
SQL> create table chf.t_xifenfei_move_new tablespace test_ocp
2 as
3 select * from chf.t_xifenfei_move;

Table created.

Elapsed: 00:01:59.22
SQL> alter session set events
2 ’10046 trace name context off’;

Session altered.

Elapsed: 00:00:00.00
SQL> select d.value||’/'||lower(rtrim(i.instance,chr(0)))||’_ora_’||p.spid||’.trc’ trace_file_name from
2 (select p.spid from v$mystat m, v$session s,v$process p where m.statistic# = 1 and s.sid = m.sid and p.addr = s.paddr ) p,
3 (select t.instance from v$thread t,v$parameter v where v.name = ‘thread’ and(v.value = 0 or t.thread# = to_number(v.value))) i,
4 (select value from v$parameter where name = ‘user_dump_dest’) d;

TRACE_FILE_NAME
——————————————————————————–
/opt/oracle/diag/rdbms/chf/chf/trace/chf_ora_5121.trc

从这里看出cast操作用时:00:01:59.22,比move稍微少,但是cast要实现move完全的功能,还需要表重命名,表授权,编译无效对象等。

3.2)查看trace内容

[oracle@node1 ~]$ tkprof  /opt/oracle/diag/rdbms/chf/chf/trace/chf_ora_5121 .trc /tmp/xifenfei_create .txt
 
TKPROF: Release 11.2.0.3.0 - Development on Tue Jan 10 11:08:19 2012
 
Copyright (c) 1982, 2011, Oracle and /or its affiliates.  All rights reserved.
 
 
********************************************************************************
 
create table chf.t_xifenfei_move_new tablespace test_ocp
as
select * from chf.t_xifenfei_move
 
call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1      0.00       0.02          1          4          0           0
Execute      1      9.85     118.37     105587     106097     112387     7432085
Fetch        0      0.00       0.00          0          0          0           0
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total        2      9.85     118.40     105588     106101     112387     7432085
 
Misses in library cache during parse: 1
Optimizer mode: ALL_ROWS
Parsing user id : SYS
Number of plan statistics captured: 1
 
Rows (1st) Rows (avg) Rows (max)  Row Source Operation
---------- ---------- ----------  ---------------------------------------------------
          0          0          0  LOAD AS SELECT  (cr=106631 pr =105592 pw=105585 time =118338607 us)
    7432085    7432085    7432085   TABLE ACCESS FULL T_XIFENFEI_MOVE (cr=105591 pr =105586 pw=0 time =2935008 us cost=23453 size=720912245 card=7432085)
 
********************************************************************************

通过这个可以看出,CAST其实本质也是全表扫描,然后append方式插入数据

4.比较move和cast
4.1)通过比较执行时间,cast稍微少,但是还有后续操作需要时间
4.2)通过比较执行计划,两者是一样的
4.3)move操作在整个过程中都会锁表,而cast不会锁住原表(select+where可以减少停业务时间)
4.4)move操作会一次性处理好权限,plsql/view等有效,而cast在rename之后,相关对象可能需要重新编译,重新授权等操作
4.5)cast操作index需要新建(create),而move操作index需要重建(rebuild)
4.6)cast完成后,需要对表重命名,删除原表操作操作,而这个操作move不用

5.选择使用谁
5.1)如果停业务时间够长,建议使用move操作
5.2)如果停业务时间不能太长,可以使用cast+where实现
5.3)如果数据库版本>=10g,且表空间使用local管理,那么可以考虑在不停业务的情况下使用shrink实现类此功能

至于MOVE和CAST在执行过程中,关于产生的redo和undo的比较,请见下篇:MOVE和CAST比较(续)




原文地址:http://www.xifenfei.com/2012/01/move%E5%92%8Ccast%E6%AF%94%E8%BE%83.html


先展示下效果 https://pan.quark.cn/s/5061241daffd 在使用Apache HttpClient库发起HTTP请求的过程中,有可能遇到`HttpClient`返回`response`为`null`的现象,这通常暗示着请求未能成功执行或部分资源未能得到妥善处理。 在本文中,我们将详细研究该问题的成因以及应对策略。 我们需要掌握`HttpClient`的运作机制。 `HttpClient`是一个功能强大的Java库,用于发送HTTP请求并接收响应。 它提供了丰富的API,能够处理多种HTTP方法(例如GET、POST等),支持重试机制、连接池管理以及自定义请求头等特性。 然而,一旦`response`对象为`null`,可能涉及以下几种情形:1. **连接故障**:网络连接未成功建立或在请求期间中断。 需要检查网络配置,确保服务器地址准确且可访问。 2. **超时配置**:若请求超时,`HttpClient`可能不会返回`response`。 应检查连接读取超时设置,并根据实际需求进行适当调整。 3. **服务器故障**:服务器可能返回了错误状态码(如500内部服务器错误),`HttpClient`无法解析该响应。 建议查看服务器日志以获取更多详细信息。 4. **资源管理**:在某些情况下,如果请求的响应实体未被正确关闭,可能导致连接被提前释放,进而使后续的`response`对象为`null`。 在使用`HttpClient 3.x`版本时,必须手动调用`HttpMethod.releaseConnection()`来释放连接。 而在`HttpClient 4.x`及以上版本中,推荐采用`EntityUtils.consumeQuietly(respons...
<think>好的,用户现在问的是Oracle中的shrink操作如何结合nologging来写。我需要先回顾一下shrink spacenologging的相关知识。 首先,shrink space是用来重组表数据,减少碎片,释放空间的操作。通常在启用了行移动的情况下才能执行。而nologging选项通常用于减少redo日志的生成,加快操作速度,但可能会影响恢复能力。 用户可能想知道在执行shrink时如何应用nologging,但根据之前的了解,shrink操作本身是否支持nologging呢?可能需要查证一下官方文档或者实际测试。假设用户可能混淆了某些操作,比如表重建时使用nologging,而shrink本身可能不支持直接指定nologging。 然后,我需要检查用户的历史提问,之前他询问过如何查找用户下注释为空的对象,现在转向shrinknologging,可能是在进行空间优化,或者维护数据库性能。用户可能是一位DBA,或者是开发人员,负责数据库维护,需要优化存储空间,同时减少日志开销。 可能存在的误区是认为shrink操作可以使用nologging,但实际上Oracle的shrink命令是否允许nologging参数?根据记忆,ALTER TABLE ... SHRINK SPACE并没有直接提供nologging的选项。nologging通常用于直接路径操作,比如CTAS、INSERT /*+ APPEND */,或者某些DDL如ALTER TABLE MOVE。 所以正确的做法可能是在move表时使用nologging,而shrink本身并不支持。这时候需要向用户解释两者的区别,并提供替代方案,比如使用move加上nologging,然后再启用行移动进行shrink。但需要注意move操作会改变行的物理位置,可能需要重建索引,同时会影响日志生成。 另外,用户可能想通过nologging减少日志量,提升shrink速度,但可能对shrinkmove的区别不太清楚。需要明确说明shrink本身是否会产生大量redo,以及如何结合nologging来优化。 总结回答步骤: 1. 指出shrink操作本身不支持nologging。 2. 提供替代方案,如使用alter table move nologging,但需要重建索引。 3. 说明shrinkmove的区别,以及各自的适用场景。 4. 提醒用户nologging的风险,比如无法通过redo恢复,需要备份。 5. 可能给出示例代码,说明如何正确使用moveshrink。</think>--- 在Oracle中,**`SHRINK SPACE`** 操作主要用于压缩表段(消除碎片、释放空间),但 **`SHRINK` 本身不支持直接使用 `NOLOGGING` 模式**。若需减少日志生成,需结合 `MOVE` 操作或调整表的日志模式。以下是详细说明: --- ### **方法1:直接使用 `SHRINK SPACE`** `SHRINK SPACE` 默认生成完整redo日志,无法通过 `NOLOGGING` 减少日志量: ```sql -- 启用行移动(必需) ALTER TABLE 表名 ENABLE ROW MOVEMENT; -- 执行压缩 ALTER TABLE 表名 SHRINK SPACE; ``` --- ### **方法2:`MOVE` 操作 + `NOLOGGING`** 若需减少日志,可通过 `MOVE` 重组表并指定 `NOLOGGING`: ```sql -- 设置表为NOLOGGING模式 ALTER TABLE 表名 NOLOGGING; -- 执行MOVE操作(重组表数据) ALTER TABLE 表名 MOVE NOLOGGING; -- 重建索引(MOVE后索引失效) ALTER INDEX 索引名 REBUILD NOLOGGING; -- 恢复表为LOGGING模式(可选) ALTER TABLE 表名 LOGGING; ``` --- ### **关键区别** | **操作** | **支持NOLOGGING** | **是否释放空间** | **索引状态** | **适用场景** | |----------------|-------------------|------------------|----------------------|---------------------------| | `SHRINK SPACE` | 否 | 是 | 保持有效 | 在线碎片整理,允许少量DML | | `MOVE` | 是 | 是 | 需要重建索引 | 离线重组,追求最小日志量 | --- ### **注意事项** 1. **`NOLOGGING` 的风险** - 操作期间若发生故障,数据可能无法通过redo恢复,需提前备份。 - 仅建议在维护窗口或可接受数据丢失风险的场景使用。 2. **空间要求** - `MOVE` 需要额外空间存储重组后的数据,确保表空间足够。 3. **补充操作** - 执行 `MOVE` 后需重建索引、统计信息: ```sql ANALYZE TABLE 表名 COMPUTE STATISTICS; ``` --- ### **示例完整脚本** ```sql -- 1. 设置表为NOLOGGING ALTER TABLE employees NOLOGGING; -- 2. 执行MOVE操作 ALTER TABLE employees MOVE NOLOGGING; -- 3. 重建主键索引 ALTER INDEX emp_pk REBUILD NOLOGGING; -- 4. 恢复日志模式 ALTER TABLE employees LOGGING; ``` --- 若需结合 `SHRINK` `NOLOGGING`,建议先用 `MOVE NOLOGGING` 减少日志,再定期执行 `SHRINK` 维护碎片。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值