Oracle中的截断表

Oracle中的截断表,oracle,truncate,Oracle,Truncate,我需要截断一个有大约4000万条记录的表。我想可以重用表的存储,因为新数据将在截断后插入。 我需要知道 大约需要多少时间来执行该命令 截断表重用存储;这需要时间 这是否可以脱机完成,以便数据库上的操作/命令 不要受到影响 基于,因此操作/命令不会受到影响,听起来您希望用良好的值替换表的内容,而不让任何人看到空表。如果用户/进程需要能够在切换内容时继续对表进行更改,则需要研究DBMS_的重新定义。换句话说,如果这是一个只读表,您可以在没有人插入/更新/删除其内容的情况下执行此操作,有一种很好的DI

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

大约需要多少时间来执行该命令 截断表重用存储;这需要时间

这是否可以脱机完成,以便数据库上的操作/命令 不要受到影响


基于,因此操作/命令不会受到影响,听起来您希望用良好的值替换表的内容,而不让任何人看到空表。如果用户/进程需要能够在切换内容时继续对表进行更改,则需要研究DBMS_的重新定义。换句话说,如果这是一个只读表,您可以在没有人插入/更新/删除其内容的情况下执行此操作,有一种很好的DIY方法可以利用分区交换:

1创建一个表,该表具有与原始表相同的分区和索引,并且具有所需的良好行。 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 ;

你说的离线是什么意思?RDBMS必须启动并运行,您才能截断表。@ammoQ他可能是指在线-不停止当前操作,这是正确的。。。我的意思是,在不影响其他表上的其他DB操作/命令的情况下,将表作为后台操作截断。谢谢Kevin。我想将此作为最后一个选项,因为我们只有很少的索引、序列、约束等依赖于此表,并且不想重新创建所有这些。。。我正在研究truncate table drop存储和truncate table reuse存储的选项。不确定哪个会完成得更快。大约,对于一个有4000万条记录的表来说,truncate表删除存储需要多少时间?这对依赖项的影响与truncate+重新填充相同。阅读代码-唯一的DROP TABLE或CREATE INDEX操作是针对helper TMP表的。这只是一种在用户看不到空表的情况下截断+重新填充的方法。如果您对用户在截断后和重新填充时看到一个空表感到满意,那么是的,TRUNCATE+重新填充。TRUNCATE几乎是瞬时的-通常不到5秒,无论存储选项如何,即使有很多分区/子分区。您需要禁用截断或分区交换的外键依赖项。