oracle分区表的特性

2022-05-05  本文已影响0人  扫地专业高级研究生

数据库版本:oracle12c

分区表的定义:将一个外模式展示为一个整体的表,在内模式下采用不同的逻辑分区进行物理存储的一种表。其对外在使用上和普通表上是一样的,但在内部执行sql语句上是存在一些差异。

何为分区:首先分区的概念基础是在oracle的保存数据的逻辑结构而言的,也就是segment(段),extend(区)和block(块)分级下的,其中一个segment在非分区表情况下,一个表就是一个段。但如果是分区表则每个分区都是一个段,因此区在oracle内部就代表一个段,也就是说分区表在内模式下是多个表,但在外模式下我们只看到了一个表,oracle在这里做了一些神奇的操作。

如果新建分区表:要建立分区表的一个前提就是,得告诉oracle数据库它应该怎样分区你的数据,包括是以那些字段,按照什么逻辑来分。当然分区的逻辑是预先保留在oracle程序中的,普通人根本没法创造自己的逻辑。所以唯一能做的是——翻牌,选一个中意的算法。目前支持的有range(区域分区),list(列表分区),hash(hash分区)。。。【还有一个忘了,应该不常用】。range分区的意思就是根据按照你给出的分区字段的范围(一般是数字的多少到多少)。list分区根据你给出的值匹配,在那个列表里面就是那个分区。hash分区就牛逼了,你不用告诉他什么范围或者值是多少,只需要说明用那个字段,要建立多少个分区,后面他会根据hash算法比较均匀的分区成几个。

分区表的特性:

1,分区表由于是给了字段,所以在使用到分区字段进行查询时,他可以说是白给的索引,效率也是杠杠的(经过测试,如果数据没有1千万以上,就算用了分区字段也并没有普通表建立索引来得快,只能说能看)。当然如果没有用到分区键,他用起来是比普通表慢的,即便建立全局索引也是一样的。

2,关于索引,分区表有两种索引,一是全局索引,二是本地索引。全局索引就是对整个分区表的数据建立一个索引,本立索引就是每个分区都建立索引,分别保存。全局索引的执行策略和普通表的执行策略一样。本地索引是建立在每个分区的,因此在没有使用分区键作为查询条件的情况下,他会遍历所有分区,在每个分区分别进行一次索引查询,所以使用分区表就得用分区键,不用分区键那分区干啥。另外在使用全局索引的时候,如果对分区进行了truncate(删除),exchange(转换),split(拆分),merge(合并)操作之后,一定要在语句后面加上update global indexes,因为ddl语句都是不会走索引的,所以索引感知不到你对分区表进行了处理。

3,分区消除,也就是上面说的当用分区键刚好落在某个分区的时候,他就不会去查其他分区的数据了。

4,分区truncate,我们都晓得一个事情,就是传统的delete并不释放表空间而truncate可以,并且truncate有一个优点,就是不支持数据会滚,就是你删了就是删了,完全不支持后悔。这看起来有点不保险,但当你毅然决然的想删除那些没用的数据的时候,你就会想到它的好处了。它不产生回滚日志节约写日志的时间,你想想,oracle得记录你删除1千万条得回滚数据,同时还得记录你删除这一千万条数据的操作的回滚日志,虽然不是双份空间,但也是有那么大。还有个好处就是释放表空间。在说到它跟分区表的关系,由于truncate是ddl(数据库定义语言)他最小的作用空间就是segment,所以想要带条件truancate普通表是不可能的,但分区表可以,可以一次truncate一个分区(这里就可以想到在一些历史备份表中使用场景了,因为大多数情况,历史数据都是按天进行备份清理的,所以用这个看起来还可以),

5,分区exchange(转换),什么是分区,他就是一个segment,也就是说他就是一个普通表,所以在有必要的情况下,他可以和其他segment互换身份,所以当你想把当前表的某个分区换到历史表的某个分区的时候,就非常简单了,你就告诉他,以后跟着历史表姓了,然后数据迁移完了(这当然是个人臆想,来源于对数据迁移复杂度的恐惧,这样岂不是爽快,但现实情况往往很复杂,当前表一般都不是分区表)。只能说exchange是一个有用的小技巧。

分区表使用场景及建议:如果几乎所有查询都用不到分区键,那就不要用分区表。如果数据量较小,没有其他特殊需求的情况下,不要用分区表(经过测试,就算使用了分区键做查询,如果数据量不是非常非常大,他还没有直接在普通表上建索引快,慢又不是慢一点点那么简单)。在数据量大,具有明显分区特色(所有dsl都用到分区键),并且经常需要做数据迁移的地方,还是非常适合用分区表的。

上一篇 下一篇

猜你喜欢

热点阅读