Oracle-删除大量行是否会由于插入大量行而导致类似的索引争用?

Oracle-删除大量行是否会由于插入大量行而导致类似的索引争用?,oracle,oracle12c,oracle19c,Oracle,Oracle12c,Oracle19c,在Oracle RDBMS中,如果使用多个线程插入影响单个索引段(即,非分区表上的常规索引或分区表上的本地索引)的大量数据,则由于索引上的争用,插入速度会变慢。每个线程都在竞争索引上的闩锁和锁,这是性能问题的根本原因。这可以通过对表进行分区并在每个分区中运行一个线程来解决,该线程插入非常大数据的子集 删除大量数据是否也有同样的问题?我认为删除还需要锁定索引的子集,这将阻止在该子集上插入/删除的其他线程。但是,我不清楚执行删除时的锁定程度是否与执行插入时的锁定程度相似。可能锁定的数量要小得多,或者

在Oracle RDBMS中,如果使用多个线程插入影响单个索引段(即,非分区表上的常规索引或分区表上的本地索引)的大量数据,则由于索引上的争用,插入速度会变慢。每个线程都在竞争索引上的闩锁和锁,这是性能问题的根本原因。这可以通过对表进行分区并在每个分区中运行一个线程来解决,该线程插入非常大数据的子集

删除大量数据是否也有同样的问题?我认为删除还需要锁定索引的子集,这将阻止在该子集上插入/删除的其他线程。但是,我不清楚执行删除时的锁定程度是否与执行插入时的锁定程度相似。可能锁定的数量要小得多,或者锁定所需的时间要小得多,因此争用也会小得多

可能还有其他情况需要考虑:可能deletes会阻止其他删除,但可能deletes不会阻止其他插入,因为很可能并行delete和insert不会在相同的数据块上工作

任何参考资料都很好。

您可以: 一,

  • 从一开始就开始清理所有索引,只需删除它们
  • 执行你的线程
  • 该过程完成后,您可能会创建索引,具体取决于是否已创建索引 无论是否分区,您都可以将其创建为本地。 Drop和Create执行与更新相同的操作。如果要插入带有索引的数据,这将导致浪费大量时间。W 在插入数据之前,必须始终清除索引
    • 在表中创建分区
    • 参考是创建分区中最重要的字段

    在Oracle中删除大量行的操作成本惊人

    超过某个阈值时,甚至建议创建一个包含剩余行的新表,交换名称并删除旧表

    正如Vahram所说,给定一定数量,有些人会关闭索引(ALTER index xxx UNASABLE),删除行并重建索引(ALTER index xxx rebuild)


    关于争用,我想您不会遇到与大插入相同的争用(因为不会有索引块拆分),但我不确定。

    我认为很难知道Oracle DB内部数据结构的复杂性。您可以检查相应SQL语句的执行计划,了解其成本。尽管它可能几乎无法给出准确的答案,因为执行计划将主要跟踪实际的数据检索成本,而不是实际的数据修改(插入/删除)成本。