我需要创建一个包含另一个字段的字段的表,但我不想用另一个字段的值填充它。 即:
假设我们有一个包含数百万条记录的表A,我想创建一个表B(不是视图,它将成为一个表),它包含3列具有相同类型的表A.
我是通过以下方式完成的:
CREATE TABLE B AS (
SELECT column1,column2,column3 from A where 1=0;
);
但我真的很关心性能的执行,我担心该方法会获取每一行(记住表有很多行)并检查荒谬的情况。
因此我的问题是:
是否为每一行或sql优化器检查条件 会自动丢弃吗?
有更好的方法吗?
提前致谢。
答案 0 :(得分:4)
优化器将在编译时评估条件,并且不会从表中获取所有数据,只是为了检查不依赖于所提取数据的谓词。
但是,通常,您只需使用适当的数据类型构建CREATE TABLE
语句,而不是基于SELECT
语句创建表。您无法使用CREATE TABLE AS SELECT
语句在您正在创建的表上定义约束,如果这确实是永久表,那么这是您真正想要的。
如果您真的想要,可以使用DBMS_METADATA.GET_DDL
过程来获取表的DDL,然后手动修改该DDL以提取您想要保留的内容。
答案 1 :(得分:1)
您的方法没有任何问题。 Oracle将首先创建一个空表,然后尝试填充它。因为where条件返回false,所以不会获取任何数据,因此不会出现性能问题; 我确实在10 Mil大表上试了一下,没有性能问题。
米歇尔。