【问题标题】:Can i specify the order while inserting the data in oracle?在oracle中插入数据时可以指定顺序吗?
【发布时间】:2013-02-19 16:03:25
【问题描述】:

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

谢谢

【问题讨论】:

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

标签: oracle insert rowid


【解决方案1】:

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

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

然而,在功能上,按 rowid 排序似乎有点可疑。如果源表已经以所需的方式排序,那么在 origin1 上进行全表扫描就可以完成这项工作。否则,我会在您想要改进聚类/压缩的列上进行排序。

尽管按索引排序的表或散列集群在集群因子方面会产生类似的效果,但它们带有一些可能无用的限制。在 IOT 的情况下,大型插入通常有助于将行排序作为选择的一部分,以便更有效地维护目标表。

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 我认为文档仅在直接路径插入方面是正确的,即使如此,对范围的引用也不是真正正确的。并行直接路径插入为每个 PQ 从站定义了新范围,但串行直接路径插入没有。我为该页面提交了读者评论。
    • @DavidAldridge 我也对这个限制很感兴趣。它可能适用于标准插入,其中插入的数据将仅在插入的每个范围内进行排序。我认为串行直接路径插入是安全的(至少这是我的经验)。
    • 这是否意味着如果我使用直接路径插入或并行的直接路径插入,订单将不会得到保证?
    • 将订购没有并行的直接路径插入。我不确定并行,也不确定标准插入。
    • 我很确定标准插入不会被排序,因为插入行的块在某种程度上分布在 HWM 下的可用块中。并行直接路径...也不确定。没有可用于对其进行测试的实例,但这样做很简单。
    猜你喜欢
    • 2021-05-20
    • 1970-01-01
    • 1970-01-01
    • 2018-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-29
    相关资源
    最近更新 更多