我需要截断一个包含大约4000万条记录的表。我想可以为表重新存储STORAGE,因为在截断后会插入新数据。 我需要知道
命令的时间大约是多少
TRUNCATE TABLE <tablename> REUSE STORAGE;
会占用。
可以脱机完成,以便在DB上执行操作/命令 不受影响?
答案 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 ;