Indexing 提出了一种在oracle中删除大表中的小数据的方法

Indexing 提出了一种在oracle中删除大表中的小数据的方法,indexing,oracle10g,sql-delete,Indexing,Oracle10g,Sql Delete,我有一张3亿行的桌子。我需要从中删除大约300万。我在这张表上没有任何索引。将根据特定的日期列删除数据。像 delete from table where column_name = '1-dec-2010' 执行此操作的最佳解决方案是什么 为列编制索引并执行删除 保持表的原样,即删除而不使用索引 使用索引将使用索引扫描+删除后更新索引的开销。如果没有索引,将使用全表扫描。那么,是否有任何阈值表明,在X百万行之后,索引优先于完整表扫描?您有以下选项(按效率顺序): 分区。企业版的额外成本选项

我有一张3亿行的桌子。我需要从中删除大约300万。我在这张表上没有任何索引。将根据特定的日期列删除数据。像

delete from table where column_name = '1-dec-2010' 
执行此操作的最佳解决方案是什么

  • 为列编制索引并执行删除
  • 保持表的原样,即删除而不使用索引

  • 使用索引将使用索引扫描+删除后更新索引的开销。如果没有索引,将使用全表扫描。那么,是否有任何阈值表明,在X百万行之后,索引优先于完整表扫描?

    您有以下选项(按效率顺序):

  • 分区。企业版的额外成本选项。如果数据是按天分区的,那么删除给定日期的数据就像删除当天的分区一样简单。快速、高效、美观,但价格昂贵(除非客户能获得优惠折扣)

  • 创建新表并将要保留的数据复制到新表中(使用直接路径插入)。放下旧桌子;重命名新表(或使用动态管理的同义词)。在这种情况下,索引可能很有用,但Oracle很可能会忽略这一点,因为选择性不好(只访问大约1%的数据;优化器可能认为不值得处理索引)。 请参见此选项上的

  • 使用索引。这肯定会加快查找需要删除的记录的速度,但删除速度仍然非常慢(重做和全部删除)


  • 您有以下选项(按效率顺序):

  • 分区。企业版的额外成本选项。如果数据是按天分区的,那么删除给定日期的数据就像删除当天的分区一样简单。快速、高效、美观,但价格昂贵(除非客户能获得优惠折扣)

  • 创建新表并将要保留的数据复制到新表中(使用直接路径插入)。放下旧桌子;重命名新表(或使用动态管理的同义词)。在这种情况下,索引可能很有用,但Oracle很可能会忽略这一点,因为选择性不好(只访问大约1%的数据;优化器可能认为不值得处理索引)。 请参见此选项上的

  • 使用索引。这肯定会加快查找需要删除的记录的速度,但删除速度仍然非常慢(重做和全部删除)


  • 那么,您是在删除固定的1%的数据吗?如果是这样,并且不考虑分区,请执行以下操作:

    select di.table_name, di.index_name, di.leaf_blocks, 
           di.clustering_factor, dt.blocks
      from all_indexes di
           left join all_tables dt
             on di.table_owner = dt.owner
            and di.table_name = dt.table_name
     where di.index_name = 'my_new_index'
    
  • 在日期列上创建索引
  • 确保为该索引和表收集优化器统计信息
  • 运行如下所示的查询:

    select di.table_name, di.index_name, di.leaf_blocks, 
           di.clustering_factor, dt.blocks
      from all_indexes di
           left join all_tables dt
             on di.table_owner = dt.owner
            and di.table_name = dt.table_name
     where di.index_name = 'my_new_index'
    
    • LEAF_BLOCKS
      为您提供 索引
    • CLUSTERING\u FACTOR
      告诉您将有多少个表I/O 需要通过该索引读取整个表
    • 为您提供 表的大小(以块为单位)
    如果
    CLUSTERING\u FACTOR
    非常接近
    块的大小
    ,则该表或多或少按索引的顺序存储

    因此,如果要删除表的1%,请查看哪个较小:

    ,或
    ((叶块+聚类系数)/100)


    如果块比计算出的表达式大很多(可能大10倍),那么索引可能会加快删除速度

    那么,您是在删除固定的1%的数据吗?如果是这样,并且不考虑分区,请执行以下操作:

    select di.table_name, di.index_name, di.leaf_blocks, 
           di.clustering_factor, dt.blocks
      from all_indexes di
           left join all_tables dt
             on di.table_owner = dt.owner
            and di.table_name = dt.table_name
     where di.index_name = 'my_new_index'
    
  • 在日期列上创建索引
  • 确保为该索引和表收集优化器统计信息
  • 运行如下所示的查询:

    select di.table_name, di.index_name, di.leaf_blocks, 
           di.clustering_factor, dt.blocks
      from all_indexes di
           left join all_tables dt
             on di.table_owner = dt.owner
            and di.table_name = dt.table_name
     where di.index_name = 'my_new_index'
    
    • LEAF_BLOCKS
      为您提供 索引
    • CLUSTERING\u FACTOR
      告诉您将有多少个表I/O 需要通过该索引读取整个表
    • 为您提供 表的大小(以块为单位)
    如果
    CLUSTERING\u FACTOR
    非常接近
    块的大小
    ,则该表或多或少按索引的顺序存储

    因此,如果要删除表的1%,请查看哪个较小:

    ,或
    ((叶块+聚类系数)/100)


    如果块比计算出的表达式大很多(可能大10倍),那么索引可能会加快删除速度

    嘿,巴拉尼,谢谢你的回答。因为这是一个现有的表,所以我们不会通过分区来改变它的结构。根据第二个选项,我们在100M表上尝试了它,但令人惊讶的是,它比使用索引的简单删除慢。我甚至测试过删除180M条记录中的3M条,索引删除比非索引删除更快。但我不确定当数据超过3亿时是否会发生同样的情况。嘿,巴拉尼,谢谢你的回答。因为这是一个现有的表,所以我们不会通过分区来改变它的结构。根据第二个选项,我们在100M表上尝试了它,但令人惊讶的是,它比使用索引的简单删除慢。我甚至测试过删除180M条记录中的3M条,索引删除比非索引删除更快。但我不确定当数据超过3亿时是否会发生同样的情况。这是一次性工作还是常规工作?这是一次性工作还是常规工作?