[Oracle]探讨分区之三 - 分区与性能
[Oracle]探讨分区之三 - 分区与性能
[Oracle] 探讨分区之二 - 分区索引
http://www.zzzyk.com/database/201308/237374.html
在实际工作中,常听到初学者说:“大表分区肯定可以提高查询性能”。其实不然,在你完全不了解应用的情况下,盲目的建立分区不但不能够提高查询性能,还有可能导致查询性能下降。因此,在决定是否使用分区之前,必须了解当前的应用环境。
大体上来说,数据库的应用分为两种:OLTP和OLAP。OLTP是指在线事务处理,比如淘宝的购物网站等;OLAP是指在线分析系统,如数据仓库、数据集市等。实际应用中,也有可能出现同一个数据库系统即用于OLTP,也用于OLAP。
对于OLAP应用来说,表和索引分区确实都能够有效地提高查询性能,因为OLAP通常需要扫描大量的数据(执行计划为全表扫描),分区可以有效地减少扫描的数据量(即分区剪枝 Partition Pruning)。举个例子,假设有张大表存放了5年的数据,你的应用通常只需要访问其中1个月的数据,在没分区之前,需要扫描所有5年的数据,但有了分区之后(假设以时间戳为分区键),只需要扫描1个月的数据即可。而且对于OLAP应用来说,分区还有一个好处就是易于管理,如果你需要对历史数据进行迁移,有分区就非常方便。
但对于OLTP应用来说,索引分区就要非常小心。因为OLTP通常仅需要访问很小的一部分数据,通过索引访问是最高效的。根据B+树的原理可知,即使表再大,B+树的高度一般也就是2~3层,因此索引的查询性能几乎不会随着数据量的增大而下降(随着数据量的增大,B+树多一层也就多一次IO罢了)。但如果索引分区了,通过分区键索引确实有可能减少IO次数(因为索引分区剪枝),但如果通过非分区键索引查询呢?试想一下,如果把一张大表分为100个分区,则通过非分区键的索引每次都需要在100个分区里查找,性能将会下降100倍!因此对于OLTP系统来说,通过都建立全局非分区索引,而不是本地分区索引。