冲突的目标
在并发用户数很大的系统中,有人在读数据,有人在写数据,此时试图优化数据的物理布局常碰到两个冲突的目标。一个目标是,尽量以紧凑的方式存储数据,这有助于查询尽快找到所有数据。另一个目标是,尽量将数据分散存储,以便多个进程可以并发写入,不会造成资源争用。
把索引当成数据仓库
当待查的键值指向大量记录时,通常效率较高的做法是从头到尾扫描表并忽略索引。
当索引已含有所需信息时,就没必要在访问他所指的原始数据。
记录强制排序
索引组织表的特点:本身即是索引,是严格排序的结构,所以记录在其内部已排好序了。
为了使表中记录有序,多数数据库系统会使用索引来定义记录顺序。称为聚集索引。
和索引组织表类似,更新定义顺序的索引字段时,开销明显,因为数据库更新会导致新的排名,继而导致数据物理位置变动。
聚集索引和索引组织表缺点:表被改造成了严格的树状结构,从而达到分层排序的结果。层次型的树桩数据库已经被关系数据库取代。树状数据库的缺点:任一种层次结构,都仅有利于一类数据操作和一条访问路径,原本库文件内的数据物理分布非常整齐,但现在由于加连接、增加溢出页等改造,数据的物理分布不整齐,从而降低了性能。
数据自动分组
循环分区:完全是一种不受数据影响的内部机制。一个表可能会存储在一个或多个分区中。插入数据时,数据会按照某种方法循环地加载到各个分区,以保持插入引起的磁盘I/O操作的平衡。
循环分区可看做时随意散布数据的机制,它并不根据实际的逻辑数据相关性来分组数据。
数据驱动分区:根据一个或数个字段中的值来定义分区,每条记录插入相应的分区。此时DBMS对数据及其存储方式知道的越多越好。我们可以根据日期进行分区,把常用数据和不常用数据分别放在不同的分区中。
哈希分区:焊锡分区能保证根据分区键快速找到记录。哈希分区对范围搜索没有优势,因为哈希函数会把连续的键值转为非连续的哈希值,在根据哈希值确定物理地址。
范围分区:根据连续数据的范围对数据进行分组。范围分区非常适合处理历史性数据。分区专门用来存储特定范围内的数据,系统会色丁一个“else分区”来存储所有可能漏网的数据。同常按时间范围进行区分。
列表分区
预连接表
把至少两个表的数据分组到相同的物理区域。
预连接表与汇总表或物化视图不同,后两者只是冗余数据,一定程度上是自动更新的预期处理结果。
预连接表是物理上存储在一起的表,依据的准则通常是查询条件。 oracle把这样一组预连接表称为簇。