- 选择适合建簇的表
使用簇来保存主要用来查询的表(而非插入和更新站主导),查询时通常要联合本簇内的多个表的数据,或者单个表中检索出相关数据。
- 选择合适的字段作为簇键
一个好的簇键应有足够的唯一值以保证与每个键值响应的一组记录能大约放满一个数据块。每个簇键值的记录太少,既浪费空间,而在效率方面的改善却微乎其微。每个簇键值的记录太多,会造成额外的搜索来找到这个键值的记录。过于一般化的键值(如男/女)额外的搜索可能导致比没有簇更差的效率。
- 效率的考虑
簇相对于将一个表和他的索引分开存储将降低DML语句(Insert, Update, Delete)的效率。这一缺点与空间的使用和扫描一个表所必需访问的数据块的数目有关系。由于是多个表共享每个数据块,存储一个簇表将使用比这个表不使用簇时更多的空间。
适合存储在簇中的表:这些表通过完整性约束相关联,并且通常使用SELECT语句将两个或多个表联合起来一起访问。
如果你以用于关联的字段为表建簇,你就能降低执行这个query时,所需访问数据块的数目;一个键值上的连接所需的所有记录都在同一个数据块中。
类似的把一个单独的表存储在簇中也很有用。例如,表EMP可以按照deptno字段建簇,将相同部门的雇员记录放在一个数据块中。如果应用通常一个部门一个部门处理记录的话,就会得到好处。
hash簇的使用
hash簇适用于存储那些静态的并且经常用等查询进行查询的单独的表或者簇表。
表和索引的分区
分区的方法 1- range partitioning ; 2- hash partitioning ; 3- composite partitioning
所有的分区的逻辑属性是相同的,但他们的物理属性可以不同。
分区的剪枝 (Partition Pruning)
oracle server 可以自动识别分区,根据select 语句所指定的选择条件,只查询有用的分区。如果语句的条件中对分区字段使用了函数,优化器则不能进行分区剪枝,但to_date函数除外。
分区的优点:
- VLDB
对于大型的历史数据表及其索引,将其按时间进行分区,分别管理和方便地添加和删除。
对于关键任务数据:分区能降低维护窗口,恢复时间和故障影响,提高有效性。 分区能提高关键表和索引的访问效率。
- 降低计划维护的当机时间
可以只在某个分区上操作,而不是整个表上; 由于分区独立性,操作可以在不同分区上并行执行。
- 降低数据故障引起的当机时间
由于恢复的单位变小了(为分区),所以:执行recover命令的时间降低了; 恢复离线的表空间所需磁盘空间也减少;不可用数据也减少了。
- DSS 性能
可以只作分区扫描而不是全表扫描,提高响应时间;并且能降低排序所需的临时磁盘空间。
- I/O性能
将数据分配到不同的物理设备上,平衡I/O
- 分区透明性
Range partition
适合历史数据的分区,通常按日期
Hash partition
适合于如下情形 性能原因(并行DML,分区剪枝,partition-wise联接)
- 事先不知道映射到给定的范围内的数据有多少
- 范围分区的大小差别很大
- 分区剪枝和分区键上的partition-wise联接非常重要
分区数目应是2的乘方(2,4,8,16。。。)
不能合并,删除,拆分分区;但可以增加或减少分区的数目
Composite partition
使用range partition, 在每个分区上使用hash partition划分子分区。