1

我想以与 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 中存在的相同顺序插入合格数据?

谢谢

4

2 回答 2

1

是的,通常物理行排序是相同的。

插入的行排序依赖于使用直接路径,这在数据仓库或其他依赖它的系统中是一种相当常见的技术,以在特定索引上获得有利的压缩率和/或低聚类因子(这可能是减少位图索引大小)。

然而,在功能上,按 rowid 排序似乎有点可疑。如果源表已经以所需的方式排序,那么促进对 origin1 的全表扫描就可以完成这项工作。否则,我会订购您想要改进聚类/压缩的列。

尽管按索引排序的表或散列集群在集群因子方面会产生类似的效果,但它们具有可能无用的限制。在 IOT 的情况下,大型插入通常有助于将行排序为选择的一部分,以便更有效地维护目标表。

于 2013-02-19T17:00:26.027 回答
0

Oracle 允许您在语句中指定一个ORDER BY子句,文档说明INSERT

  • 关于ORDER BY中子查询的子句,DML_table_expression_clause仅对插入的行保证排序,并且仅在表的每个范围内保证排序。不保证新行相对于现有行的排序。

因此,行将按照您在ORDER BY子句中指定的顺序插入到您的副本表中。这显然不会影响表中已经存在的旧行。

对范围的限制可能与您无关,因为您正在使用/*+ append */提示,因此只会在水印上方插入(如果不是并行插入,则按顺序插入)。

于 2013-02-19T16:45:58.853 回答