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

时间:2013-02-19 16:03:26

标签: oracle insert rowid

我想在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中相同的顺序插入限定数据?

感谢

2 个答案:

答案 0 :(得分:1)

是的,一般情况下,物理行排序是相同的。

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

但是,在功能上,rowid的排序似乎有点令人怀疑。如果源表已经以所需的方式排序,则在origin1上提升全表扫描将完成这项工作。否则,我会在您要改进群集/压缩的列上订购。

尽管索引排序表或散列簇在聚类因子方面会产生类似的效果,但它们带有可能没有帮助的限制。在IOT的情况下,通常使用大型插入来排序行作为select的一部分,以便在目标表上获得更有效的维护。

答案 1 :(得分:0)

Oracle允许您在ORDER BY语句和documentation states中指定INSERT子句:

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

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

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

相关问题