Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在oracle中插入数据时,是否可以指定顺序?_Oracle_Insert_Rowid - Fatal编程技术网

在oracle中插入数据时,是否可以指定顺序?

在oracle中插入数据时,是否可以指定顺序?,oracle,insert,rowid,Oracle,Insert,Rowid,我想从unique1表中插入unique2表中的数据,插入顺序与unique1表中存在的顺序相同 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中存在的相同顺序插入符合条件的

我想从unique1表中插入unique2表中的数据,插入顺序与unique1表中存在的顺序相同

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中存在的相同顺序插入符合条件的数据


感谢

Oracle允许您在
INSERT
语句中指定一个
ORDER BY
子句,以及:

  • 关于
    DML_table_expression_子句
    中子查询的
    ORDER BY
    子句,仅保证插入的行的排序,并且仅在表的每个范围内。不保证新行相对于现有行的排序
因此,新的行将按照您在
order BY
子句中指定的顺序插入到复制表中。这显然不会影响表中已有的旧行


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

Oracle允许您在
insert
语句中指定
ORDER BY
子句,以及:

  • 关于
    DML_table_expression_子句
    中子查询的
    ORDER BY
    子句,仅保证插入的行的排序,并且仅在表的每个范围内。不保证新行相对于现有行的排序
因此,新的行将按照您在
order BY
子句中指定的顺序插入到复制表中。这显然不会影响表中已有的旧行


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

是的,通常物理行顺序是相同的

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

然而,从功能上看,rowid的订购似乎有点可疑。如果源表已按所需方式排序,则在origin1上升级完整表扫描即可。否则,我会对您希望通过改进集群/压缩的列进行排序


虽然索引排序表或散列集群在集群因子方面会产生类似的效果,但它们附带的限制可能没有帮助。在IOT的情况下,将行排序作为select的一部分通常对大插入很有帮助,以便对目标表进行更有效的维护。

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

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

然而,从功能上看,rowid的订购似乎有点可疑。如果源表已按所需方式排序,则在origin1上升级完整表扫描即可。否则,我会对您希望通过改进集群/压缩的列进行排序


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

以特定顺序插入数据对您意味着什么?考虑到堆组织的表本质上是无序的,行的物理顺序通常是毫无意义的。我能想到的唯一例外是
unique2
被压缩,并且您试图在同一块中获取具有重复值的行。但是您的
orderbyrowid
强烈地暗示了这里的情况并非如此。“order”对于如何在表中存储行没有任何意义,并且在select语句中强制使用order来检索行是一项毫无意义的工作。@行的顺序可能会对索引范围扫描性能产生很大的影响,这会对优化器产生很大影响。我想,如果出于测试目的要复制一个表,最好是源表及其副本具有相同的顺序(当然,这不是唯一的重要因素=)@VincentMalgrat-当然,可以对堆组织的表进行排序,以便更有效地使用任何一个索引进行范围扫描。但如果这是他们的愿望,那么使用索引组织的表或散列集群通常比使用堆组织的表更有意义,而且他们只能按主键排序。我可以想象您可能希望以某种方式对堆表的数据进行排序的原因,例如,为了报告目的,每天刷新一个物化视图。以某种方式(不同于其主键)对MV进行排序可能会很有趣,这样查询将更有效地使用索引。按特定顺序插入数据对您意味着什么?考虑到堆组织的表本质上是无序的,行的物理顺序通常是毫无意义的。我能想到的唯一例外是
unique2
被压缩,并且您试图在同一块中获取具有重复值的行。但是您的
orderbyrowid
强烈地暗示了这里的情况并非如此。“order”对于如何在表中存储行没有任何意义,并且在select语句中强制使用order是一项毫无意义的工作