我想在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中相同的顺序插入限定数据?
感谢
答案 0 :(得分:1)
是的,一般情况下,物理行排序是相同的。
insert上的行排序依赖于使用直接路径,这是数据仓库或其他系统中相当常见的技术,它依赖于它来获得有利的压缩率和/或特定索引上的低聚类因子(可能很强驱动程序减少位图索引大小)。
但是,在功能上,rowid的排序似乎有点令人怀疑。如果源表已经以所需的方式排序,则在origin1上提升全表扫描将完成这项工作。否则,我会在您要改进群集/压缩的列上订购。
尽管索引排序表或散列簇在聚类因子方面会产生类似的效果,但它们带有可能没有帮助的限制。在IOT的情况下,通常使用大型插入来排序行作为select的一部分,以便在目标表上获得更有效的维护。
答案 1 :(得分:0)
Oracle允许您在ORDER BY
语句和documentation states中指定INSERT
子句:
- 关于
ORDER BY
中子查询的DML_table_expression_clause
子句,仅对要插入的行保证排序,并且仅在表的每个范围内进行排序。不保证对现有行的新行进行排序。
因此,新行将按照您在ORDER BY
子句中指定的顺序插入到副本表中。这显然不会影响表中已有的旧行。
对范围的限制可能与您无关,因为您使用的是/*+ append */
提示,因此只会插入水印上方(如果不是平行插入,则会顺序插入)。