我对以下新手问题表示歉意,这个网络开发人员尝试做数据库并且不熟悉分区功能。
如果我在(Oracle)数据库中有两个表来保存一段时间内的记录历史:
CREATE TABLE Records(
RecordPackId NUMBER,
RecordId NUMBER,
Data VARCHAR2(4000),
PRIMARY KEY (RecordPackid, RecordId)
)
CREATE TABLE RecordPacks(
RecordPackId NUMBER,
DateTime DATE,
PRIMARY KEY (RecordPackId)
)
随着时间的推移,Records 表增长到 11GB 和 300M 行,而 RecordPacks 增长到 11k 行。
我想设置一个定期流程,获取满足某些条件的 RecordPacks 索引(例如,日期 > 1 个月前且日期不是一个月的最后一天),并从记录表中删除相应的记录.
我认为分区可能是避免长时间删除操作的解决方案。如果每个不同的 RecordPackId 值都有一个记录分区,则与从何处删除相比,它可能会更快地删除该分区。
此外,Oracle 文档指出,当表的重量超过 2GB 并包含历史数据时,应该对表进行分区,其中新数据将添加到最新分区。
但是阅读有关分区的文档,似乎按范围、列表或散列分区都需要事先知道分区的精确数量。该文档进一步介绍了分区索引,但我意识到,当我删除索引树的分支时,必须重建树以重新平衡它,并且该操作可能会永远持续下去,我错了吗?
这是否可行,按不同值进行分区是个好主意还是我绝对生气了?有没有更完善的数据库功能?
未来的插入怎么样?我应该每次插入都创建一个分区还是数据库可以自动创建一个新分区?
对于像这样的大量删除/归档,您绝对需要使用分区并避免删除。
将这些索引定义为“LOCAL”的能力可以减轻您对索引的担忧 - 这将为每个表分区创建一个单独的索引段,并且删除一个分区将删除关联的索引段,而不影响索引的其余部分 -索引将保持可用。请务必将关键字“LOCAL”添加到您的索引中。
您不需要事先知道分区的精确数量。您可能会在创建分区表的示例中看到初始分区列表。您可以随时向现有分区表添加分区。然而,最好的方法是使用“间隔分区”,让 Oracle 在传入数据需要尚不存在的分区时自动创建一个新的每日分区(或每月,或任何满足您需求的分区)。