在oracle中插入数据时,我可以指定顺序吗



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

感谢

是的,通常情况下,物理行的顺序是相同的。

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

然而,从功能上讲,rowid的排序似乎有点可疑。如果源表已经按照所需的方式排序,那么在origin1上升级完整的表扫描就可以了。否则,我会在您想要改进集群/压缩的列上排序。

尽管索引有序表或散列集群在集群因素方面会产生类似的效果,但它们附带的限制可能没有帮助。在IOT的情况下,将行排序作为选择的一部分,以获得对目标表更有效的维护,这通常有助于进行大型插入。

Oracle允许您在INSERT语句中指定ORDER BY子句,文档状态为:

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

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

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

相关内容

  • 没有找到相关文章