我想从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 */
提示,因此仅在水印上方插入(如果不是并行插入,则按顺序插入)。