2013-02-19 118 views
1

我想要从唯一1表中以unique1表中存在的相同顺序插入数据到唯一2表中。我可以在oracle中插入数据时指定顺序吗?

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

感谢

+1

数据按特定顺序插入对您而言意味着什么?鉴于堆组织的表本质上是无序的,行的物理顺序通常很没有意义。唯一的例外是我能想到的是,如果'unique2'被压缩,并且你试图在同一个块中获得具有重复值的行。但是你的'rowid'命令强烈地暗示着这不是这种情况。 – 2013-02-19 16:06:15

+0

“Order”对行在表中的存储方式没有任何意义,并且在您选择语句中强制排序以检索行时,这是毫无意义的工作。 – Wolf 2013-02-19 16:11:36

+1

@JustinCave行的顺序可能会对索引范围扫描性能产生很大的影响,这会对优化器产生很大的影响。我想如果有人想复制一张表来进行测试,最好是源表和它的副本具有相同的顺序(当然,它不是* only * important factor =) – 2013-02-19 16:14:55

回答

0

甲骨文可以让你在INSERT语句中指定的ORDER BY子句和documentation states

  • 关于在DML_table_expression_clauseORDER BY子句中的子查询,排序仅保证行被插入,并且只在表格的每个范围内。无法保证与现有行相关的新行的排序。

所以行会为你在ORDER BY子句指定的相同顺序被插入到你的复制表。这不会影响已经在表格中的旧行。

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

+0

我认为文档在直接路径插入方面是正确的,即使如此,对范围的引用也不是真正正确的。并行直接路径插入定义了每个PQ从站的新扩展盘区,但串行直接路径插入没有。我提交了该页面的读者评论。 – 2013-02-19 17:07:33

+0

@DavidAldridge我也被这个限制所吸引。它可能适用于插入的数据只在每个插入的范围内排序的标准插入。我认为串行直接路径插入是安全的(至少这是我的经验)。 – 2013-02-19 17:24:59

+0

是否意味着如果我使用直接路径插入或直接路径插入与平行命令将不会garüteed? – subash 2013-02-19 17:38:40

1

是的,一般来说,物理行排序将是相同的。

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

然而,在功能上,按rowid排序似乎有点可疑。如果源表已按照需要的方式排序,那么在origin1上提升全表扫描就可以完成这项工作。否则,我会在要改进群集/压缩的列上订购。

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

相关问题