从另一个表创建一个表而不填充它

时间:2012-03-13 18:32:23

标签: database performance oracle

我需要创建一个包含另一个字段的字段的表,但我不想用另一个字段的值填充它。 即:

假设我们有一个包含数百万条记录的表A,我想创建一个表B(不是视图,它将成为一个表),它包含3列具有相同类型的表A.

我是通过以下方式完成的:

CREATE TABLE B AS (
            SELECT column1,column2,column3 from A where 1=0;
        );

但我真的很关心性能的执行,我担心该方法会获取每一行(记住表有很多行)并检查荒谬的情况。

因此我的问题是:

  • 是否为每一行或sql优化器检查条件 会自动丢弃吗?

  • 有更好的方法吗?

提前致谢。

2 个答案:

答案 0 :(得分:4)

优化器将在编译时评估条件,并且不会从表中获取所有数据,只是为了检查不依赖于所提取数据的谓词。

但是,通常,您只需使用适当的数据类型构建CREATE TABLE语句,而不是基于SELECT语句创建表。您无法使用CREATE TABLE AS SELECT语句在您正在创建的表上定义约束,如果这确实是永久表,那么这是您真正想要的。

如果您真的想要,可以使用DBMS_METADATA.GET_DDL过程来获取表的DDL,然后手动修改该DDL以提取您想要保留的内容。

答案 1 :(得分:1)

您的方法没有任何问题。 Oracle将首先创建一个空表,然后尝试填充它。因为where条件返回false,所以不会获取任何数据,因此不会出现性能问题; 我确实在10 Mil大表上试了一下,没有性能问题。

米歇尔。