Indexing 提出了一种在oracle中删除大表中的小数据的方法
我有一张3亿行的桌子。我需要从中删除大约300万。我在这张表上没有任何索引。将根据特定的日期列删除数据。像Indexing 提出了一种在oracle中删除大表中的小数据的方法,indexing,oracle10g,sql-delete,Indexing,Oracle10g,Sql Delete,我有一张3亿行的桌子。我需要从中删除大约300万。我在这张表上没有任何索引。将根据特定的日期列删除数据。像 delete from table where column_name = '1-dec-2010' 执行此操作的最佳解决方案是什么 为列编制索引并执行删除 保持表的原样,即删除而不使用索引 使用索引将使用索引扫描+删除后更新索引的开销。如果没有索引,将使用全表扫描。那么,是否有任何阈值表明,在X百万行之后,索引优先于完整表扫描?您有以下选项(按效率顺序): 分区。企业版的额外成本选项
delete from table where column_name = '1-dec-2010'
执行此操作的最佳解决方案是什么
使用索引将使用索引扫描+删除后更新索引的开销。如果没有索引,将使用全表扫描。那么,是否有任何阈值表明,在X百万行之后,索引优先于完整表扫描?您有以下选项(按效率顺序):
您有以下选项(按效率顺序):
那么,您是在删除固定的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
告诉您将有多少个表I/O 需要通过该索引读取整个表李>CLUSTERING\u FACTOR
为您提供 表的大小(以块为单位)块
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
告诉您将有多少个表I/O 需要通过该索引读取整个表李>CLUSTERING\u FACTOR
为您提供 表的大小(以块为单位)块
CLUSTERING\u FACTOR
非常接近块的大小
,则该表或多或少按索引的顺序存储
因此,如果要删除表的1%,请查看哪个较小:
块
,或((叶块+聚类系数)/100)
如果块比计算出的表达式大很多(可能大10倍),那么索引可能会加快删除速度 嘿,巴拉尼,谢谢你的回答。因为这是一个现有的表,所以我们不会通过分区来改变它的结构。根据第二个选项,我们在100M表上尝试了它,但令人惊讶的是,它比使用索引的简单删除慢。我甚至测试过删除180M条记录中的3M条,索引删除比非索引删除更快。但我不确定当数据超过3亿时是否会发生同样的情况。嘿,巴拉尼,谢谢你的回答。因为这是一个现有的表,所以我们不会通过分区来改变它的结构。根据第二个选项,我们在100M表上尝试了它,但令人惊讶的是,它比使用索引的简单删除慢。我甚至测试过删除180M条记录中的3M条,索引删除比非索引删除更快。但我不确定当数据超过3亿时是否会发生同样的情况。这是一次性工作还是常规工作?这是一次性工作还是常规工作?