福州网站建设优化深圳关键词排名首页
福州网站建设优化,深圳关键词排名首页,wordpress 主题 打不开,网络营销软文范例大全800谈谈怎么实现Oracle数据库分区表 Oracle数据库分区是作为Oracle数据库性能优化的一种重要的手段和方法#xff0c;做手头的项目以前#xff0c;只聆听过分区的大名#xff0c;感觉特神秘#xff0c;看见某某高手在讨论会上夸夸其谈时#xff0c;真是骂自己学艺不精#x…谈谈怎么实现Oracle数据库分区表 Oracle数据库分区是作为Oracle数据库性能优化的一种重要的手段和方法做手头的项目以前只聆听过分区的大名感觉特神秘看见某某高手在讨论会上夸夸其谈时真是骂自己学艺不精最近作GPS方面的项目处理的数据量达到了几十GB为了满足系统的实时性要求必须提高数据的查询效率这样就必须通过分区以解燃眉之急 先说说分区的好处吧 1) 增强可用性如果表的某个分区出现故障表在其他分区的数据仍然可用 2) 维护方便如果表的某个分区出现故障需要修复数据只修复该分区即可 3) 均衡I/O可以把不同的分区映射到磁盘以平衡I/O改善整个系统性能 4) 改善查询性能对分区对象的查询可以仅搜索自己关心的分区提高检索速度。 Oracle数据库提供对表或索引的分区方法有三种 ü 范围分区 ü Hash分区散列分区 ü 复合分区 一、范围分区详细说明 范围分区就是对数据表中的某个值的范围进行分区根据某个值的范围决定将该数据存储在哪个分区上。如根据序号分区根据时间等来进行分区。根据序号比如小于2000000的放在part01, 2000000~4000000的放在part02。。。 create table AAA( id number primary key, indate date not null)partition by range(indate)( partition part_01 values less than(to_date(2006-01-01,yyyy-mm-dd))tablespace space01, partition part_02 values less than(to_date(2010-01-01,yyyy-mm-dd))tablespace space02, partition part_03 values less than(maxvalue)tablespace space03); space01\ space02\ space03为建立的三个表空间相当于把建立的一个大的表分在了3个不同的表空间的分区上了。 二、Hash分区散列分区详细说明 散列分区为通过指定分区编号来均匀分布数据的一种分区类型因为通过在I/O设备上进行散列分区使得这些分区大小一致。也就是只命名分区名称这样均匀进行数据分布。 三、复合分区详细说明 有时候我们需要根据范围分区后每个分区内的数据再散列地分布在几个表空间中这样我们就要使用复合分区。复合分区是先使用范围分区然后在每个分区内再使用散列分区的一种分区方法。 partition by range(indate)subpartition by hash(id) subpartitions 3 store in (space01, space02, space03) ( partition part_01 values less than(to_date(’2006-01-01’,’yyyy-mm-dd’)), partition part_02 values less than(to_date(’2010-01-01’,’yyyy-mm-dd’)), partition part_03 values less than(maxvalue) ); 四、分区表操作 1、插入记录insert into AAA values(1 ,sysdate); 2、查询分区表记录select * from AAA partition(part_01); 3、更新分区表的记录update AAA partition(part_01) t set indate’’where id1; 但是当更新的时候指定了分区而根据查询的记录不在该分区中时将不会更新数据 4、删除分区表记录delete from AAA partition(part_02) t where id4; 如果指定了分区而条件中的数据又不在该分区中时将不会删除任何数据。 5、增加一个分区alter table AAA add partition part_04 values less than(to_date(’2012-01-01’,’yyyy-mm-dd’)) tablespace dinya_spa ce03; 增加一个分区的时候增加的分区的条件必须大于现有分区的最大值否则系统将提示ORA-14074 partition bound must collate higher than that of the last partition 错误。 6、合并一个分区alter table AAA merge partitions part_01,part_02 into partition part_02; ,如果在合并的时候把合并后的分区定为part_01的时候系统将提示ORA-14275 cannot reuse lower-bound partition as resulting partition 错误。 7、删除分区alter table AAA drop partition part_01; 删除分区表的一个分区后查询该表的数据时显示该分区中的数据已全部丢失所以执行删除分区动作时要慎重确保先备份数据后再执行或将分区合并。 五、建立索引 分区表和一般表一样可以建立索引分区表可以创建局部索引和全局索引。当分区中出现许多事务并且要保证所有分区中的数据记录的唯一性时采用全局索引。 1. 局部索引分区的建立create index idx_t on AAA(id) local ( partition idx_1 tablespace space01, partition idx_2 tablespace space02, partition idx_3 tablespace space03 ); 2. 全局索引建立时global 子句允许指定索引的范围值这个范围值为索引字段的范围值create index idx_t on AAA(id)global partition by range(id) ( partition idx_1 values less than (1000) tablespace space01, partition idx_2 values less than (10000) tablespace space02, partition idx_3 values less than (maxvalue) tablespace space03 ); 当然也可以不指定索引分区名直接对整个表建立索引: create index idx_t on AAA(id); 数据库的垂直切分和水平切分 数据切分可以是物理上的对数据通过一系列的切分规则将数据分布到不同的DB服务器上通过路由规则路由访问特定的数据库这样一来每次访问面对的就不是单台服务器了而是N台服务器这样就可以降低单台机器的负载压力。 数据切分也可以是数据库内的对数据通过一系列的切分规则将数据分布到一个数据库的不同表中比如将article分为article_001,article_002等子表若干个子表水平拼合有组成了逻辑上一个完整的article表这样做的目的其实也是很简单的。 举个例子说明比如article表中现在有5000w条数据此时我们需要在这个表中增加insert一条新的数据insert完毕后数据库会针对这张表重新建立索引5000w行数据建立索引的系统开销还是不容忽视的。但是反过来假如我们将这个表分成100 个table呢从article_001一直到article_1005000w行数据平均下来每个子表里边就只有50万行数据这时候我们向一张只有50w行数据的table中insert数据后建立索引的时间就会呈数量级的下降极大了提高了DB的运行时效率提高了DB的并发量。当然分表的好处还不知这些还有诸如写操作的锁操作等都会带来很多显然的好处。 综上分库降低了单点机器的负载分表提高了数据操作的效率尤其是Write操作的效率。 数据库的读写分离 读写分离基本的原理是让主数据库处理事务性增、改、删操作INSERT、UPDATE、DELETE而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。 为什么要分库、分表、读写分 单表的数据量限制当单表数据量到一定条数之后数据库性能会显著下降。数据多了之后对数据库的读、写就会很多。分库减少单台数据库的压力。接触过几个分库分表的系统都是通过主键进行散列分裤分表的。这类数据比较特殊主键就是唯一的获取该条信息的主要途径。比如京东的订单、财付通的交易记录等。。。该类数据的用法就是通过订单号、交易号来查询该笔订单、交易。 还有一类数据比如用户信息每个用户都有系统内部的一个userid与userid对应的还有用户看到的登录名。那么如果分库分表的时候单纯通过userid进行散列分库那么根据登录名来获取用户的信息就无法知道该用户处于哪个数据库中。 或许有朋友会说我们可以维护一个email----userid的映射关系根据email先查询到userid在根据userid的分库分表规则到对应库的对应表来获取用户的记录信息。这么做是可以的但是这个映射关系的条数本身也是个瓶颈原则上是没有减少单表内数据的条数算是一个单点。并且要维护这个映射关系和用户信息的一致性修改登录名、多登录名等其他特殊需求最大一个原因其实用户信息是一个读大于写的库web2.0都是以用户为中心所有信息都和用户信息相关联所以对用户信息拆分还是有一定局限性的。 对于这类读大于写并且数据量增加不是很明显的数据库推荐采用读写分离缓存的模式试想一下一个用户注册、修改用户信息、记录用户登录时间、记录用户登录IP、修改登录密码这些是写操作。但是以上这些操作次数都是很小的所以整个数据库的写压力是很小的。唯一一个比较大的就是记录用户登录时间、记录用户登录IP这类信息只要把这些经常变动的信息排除在外那么写操作可以忽略不计。所以读写分离首要解决的就是经常变化的数据的拆分比如用户登录时间、记录用户登录IP。这类信息可以单独独立出来记录在持久化类的缓存中可靠性要求并不高登陆时间、IP丢了就丢了下次来了就又来了 以oracle为例主库负责写数据、读数据。读库仅负责读数据。每次有写库操作同步更新cache每次读取先读cache在读DB。写库就一个读库可以有多个采用dataguard来负责主库和多个读库的数据同步。 转载于:https://www.cnblogs.com/adolfmc/p/5381737.html
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/86225.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!