在Oracle中截断表

时间:2014-07-01 10:00:12

标签: oracle truncate

我需要截断一个包含大约4000万条记录的表。我想可以为表重新存储STORAGE,因为在截断后会插入新数据。 我需要知道

  1. 命令的时间大约是多少 TRUNCATE TABLE <tablename> REUSE STORAGE;会占用。

  2. 可以脱机完成,以便在DB上执行操作/命令 不受影响?

1 个答案:

答案 0 :(得分:3)

基于&#34;因此操作/命令不会受到影响&#34;,听起来您想用&#34; good&#34替换表的内容;值,没有人看到空表。如果用户/进程需要能够在切换内容时继续对表进行更改,则需要研究DBMS_REDEFINITION。如果这是一个只读表(换句话说,你可以在没有人插入/更新/删除其内容的情况下执行此操作),那么有一个很好的DIY方法可以利用分区交换:

1)创建一个具有与原始相同的分区和索引的表,并具有所需的&#34; good&#34;行。
2)
如果您的桌子被分割:

CREATE TABLE <tablename>_TMP AS SELECT * FROM <tablename> WHERE 1=0;

-- Add any local indexes on <tablename> as standard indexes on <tablename_tmp>

BEGIN 
    FOR R IN (SELECT * FROM USER_TAB_PARTITIONS WHERE TABLE_NAME = <tablename>)
    LOOP
        EXECUTE IMMEDIATE 
            'INSERT INTO <tablename>_TMP' 
            ||' SELECT * FROM <good_data_tablename> PARTITION ('||R.PARTITION_NAME||')';
        EXECUTE IMMEDIATE
            'ALTER TABLE <tablename>_TMP' 
            ||' EXCHANGE PARTITION WITH TABLE <tablename> PARTITION ' || R.PARTITION_NAME 
            ||' INCLUDING INDEXES WITHOUT VALIDATION UPDATE GLOBAL INDEXES';
        EXECUTE IMMEDIATE 
            'TRUNCATE TABLE <tablename>_TMP';
    END LOOP    
END;
/

DROP TABLE <tablename>_TMP ;

如果您的桌子没有分区:

CREATE TABLE <tablename>_TMP 
PARTITION BY RANGE (<non-null-column>)
(PARTITION ALL_DATA values less than (maxvalue))
AS SELECT * FROM <good_data_tablename>;

-- Add any <tablename> indexes as local indexes on <tablename>_TMP 

ALTER TABLE <tablename> EXCHANGE PARTITION WITH TABLE <tablename>_TMP INCLUDING INDEXES WITHOUT VALIDATION;

DROP TABLE <tablename>_TMP ;