【发布时间】:2013-02-19 16:03:25
【问题描述】:
我想以与 unique1 表中存在的顺序相同的顺序将数据从 unique1 表插入到 unique2 表中。
insert /*+ append */ into unique2
select * from unique1 A where not exists (select 1 from match1 B where A. promolog_key = B. promolog_key) order by rowid asc;
上述查询是否按照其在 unique1 中存在的相同顺序插入符合条件的数据?
谢谢
【问题讨论】:
-
按特定顺序插入数据对您意味着什么?鉴于堆组织表本质上是无序的,行的物理顺序通常毫无意义。我能想到的唯一例外是
unique2被压缩并且您试图在同一块中获取具有重复值的行。但是您的order by rowid强烈暗示这里不是这种情况。 -
“顺序”对于行在表中的存储方式没有任何意义,当您在 select 语句中强加顺序以检索行时,这是一项没有实际意义的工作。
-
@JustinCave 行的顺序会对索引范围扫描性能产生很大影响,这会对优化器产生很大影响。我想如果一个人想要复制一个表来进行测试,最好是源表和它的副本有相同的顺序(当然它不是 only 重要的因素=)
-
@VincentMalgrat - 当然,可以订购一个堆组织的表,以提高使用任何一个索引进行范围扫描的效率。但如果这是需要的话,通常使用索引组织表或哈希集群而不是堆组织表更有意义。
-
@JustinCave 他们只能通过 PK 来订购它们。我可以想象您可能希望以某种方式为堆表排序数据的原因,例如,为了报告目的而每天刷新物化视图。以某种方式(不同于它的 PK)订购这个 MV 可能会很有趣,这样查询将更有效地使用索引。