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

Database 从另一个表创建一个表而不填充它,database,performance,oracle,Database,Performance,Oracle,我需要创建一个表,该表包含另一个表包含的一些字段,但我不想用另一个表包含的值填充它。 即: 假设我们有一个包含数百万条记录的表a,我想创建一个表B(这不是一个视图,它将是一个表),其中包含表a中3列相同类型的数据 我是这样做的: CREATE TABLE B AS ( SELECT column1,column2,column3 from A where 1=0; ); 但是我真的很关心性能,我担心这个方法会获取每一行(记住这个表有这么多行)并检查荒谬的

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

假设我们有一个包含数百万条记录的表a,我想创建一个表B(这不是一个视图,它将是一个表),其中包含表a中3列相同类型的数据

我是这样做的:

CREATE TABLE B AS (
            SELECT column1,column2,column3 from A where 1=0;
        );
但是我真的很关心性能,我担心这个方法会获取每一行(记住这个表有这么多行)并检查荒谬的条件

因此,我的问题是:

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

  • 有更好的方法吗


提前感谢。

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

但是,通常,您只需使用适当的数据类型构建
createtable
语句,而不是基于
SELECT
语句创建表。您不能在使用
createtableasselect
语句创建的表上定义约束之类的操作,如果这真的是一个永久表,那么这是您真正想要的


如果你真的想,您可以使用
DBMS\u METADATA.GET\u DDL
过程获取表的DDL,然后手动修改该DDL以提取您想要保留的内容。

优化器将在编译时评估条件,不会从表中获取所有数据,只是为了检查一个不依赖于当前数据的谓词抓到了

但是,通常,您只需使用适当的数据类型构建
createtable
语句,而不是基于
SELECT
语句创建表。您不能在使用
createtableasselect
语句创建的表上定义约束之类的操作,如果这真的是一个永久表,那么这是您真正想要的


如果确实需要,可以使用
DBMS\u METADATA.GET\u DDL
过程获取表的DDL,然后手动修改该DDL以提取您想要保留的内容。

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


米歇尔。

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

米歇尔