﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-小虫-文章分类-ORACLE</title><link>http://www2.blogjava.net/sowill/category/16716.html</link><description>飞虫在天</description><language>zh-cn</language><lastBuildDate>Fri, 23 Mar 2007 22:28:53 GMT</lastBuildDate><pubDate>Fri, 23 Mar 2007 22:28:53 GMT</pubDate><ttl>60</ttl><item><title>oracle中的分区</title><link>http://www.blogjava.net/sowill/articles/oracle.html</link><dc:creator>shaka sowill</dc:creator><author>shaka sowill</author><pubDate>Mon, 30 Oct 2006 13:45:00 GMT</pubDate><guid>http://www.blogjava.net/sowill/articles/oracle.html</guid><wfw:comment>http://www.blogjava.net/sowill/comments/78146.html</wfw:comment><comments>http://www.blogjava.net/sowill/articles/oracle.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sowill/comments/commentRss/78146.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sowill/services/trackbacks/78146.html</trackback:ping><description><![CDATA[   Oracle9i通过引入列表分区（List Partition），使得当前共有4种分区数据的方法，具体列出如下：<br />　　<br />　　第一种 范围分区<br />　　1 对表进行单列的范围分区：<br />　　这使最为常用也是最简单的方法，具体例子如下：<br />　　create table emp<br />　　(empno number(4),<br />　　ename varchar2(30),<br />　　sal number)<br />　　partition by range(empno)<br />　　(partition e1 values less than (1000) tablespace emp1,<br />　　partition e2 values less than (2000) tablespace emp2,<br />　　partition e3 values less than (maxvalue) tablespace emp3);<br />　　<br />　　insert into emp values (100,Tom,1000);<br />　　insert into emp values (500,Peter,2000);<br />　　insert into emp values (1000,Scott,3000);<br />　　insert into emp values (1999,Bill,4000);<br />　　insert into emp values (5000,Gates,6000);<br />　　commit;<br />　　<br />　　从emp表中选择全部的纪录如下：<br />　　SQL&amp;gt; select * from emp;<br />　　<br />　　EMPNO ENAME SAL<br />　　---------- ------------------------------ ----------<br />　　100 Tom 1000<br />　　500 Peter 2000<br />　　1000 Scott 3000<br />　　1999 Bill 4000<br />　　5000 Gates 6000<br />　　<br />　　还可以按照分区进行选择：<br />　　SQL&amp;gt; select * from emp partition (e1);<br />　　EMPNO ENAME SAL<br />　　---------- ------------------------------ ----------<br />　　100 Tom 1000<br />　　500 Peter 2000<br />　　<br />　　SQL&amp;gt; select * from emp partition (e2)<br />　　EMPNO ENAME SAL<br />　　---------- ------------------------------ ----------<br />　　1000 Scott 3000<br />　　1999 Bill 4000<br />　　<br />　　SQL&amp;gt; select * from emp partition (e3)<br />　　EMPNO ENAME SAL<br />　　---------- ------------------------------ ----------<br />　　5000 Gates 6000<br />　　<br />　　使用了分区，还可以单独针对指定的分区进行truncate操作：<br />　　alter table emp truncate partition e2;<br />　　<br />　　2 对表进行多列的范围分区：<br />　　多列的范围分区主要是基于表中多个列的值的范围对数据进行分区，例如：<br />　　drop table emp;<br />　　create table emp<br />　　(empno number(4),<br />　　ename varchar2(30),<br />　　sal number,<br />　　day integer not null,<br />　　month integer not null)<br />　　partition by range(month,day)<br />　　(partition e1 values less than (5,1) tablespace emp1,<br />　　partition e2 values less than (10,2) tablespace emp2,<br />　　partition e3 values less than (maxvalue,maxvalue) tablespace emp3);<br />　　<br />　　SQL&amp;gt; insert into emp values (100,Tom,1000,10,6);<br />　　SQL&amp;gt; insert into emp values (200,Peter,2000,3,1);<br />　　SQL&amp;gt; insert into emp values (300,Jane,3000,23,11);<br />　　<br />　　<br />　　第二种 Hash分区：<br />　　hash分区最主要的机制是根据hash算法来计算具体某条纪录应该插入到哪个分区中<br />　　（问：hash算法是干什么的？呵呵，只能去看看数据结构了）<br />　　hash算法中最重要的是hash函数，Oracle中如果你要使用hash分区，只需指定分区的数量即可<br />　　建议分区的数量采用2的n次方，这样可以使得各个分区间数据分布更加均匀<br />　　具体例子如下：<br />　　drop table emp;<br />　　create table emp (<br />　　empno number(4),<br />　　ename varchar2(30),<br />　　sal number)<br />　　partition by hash (empno)<br />　　partitions 8<br />　　store in (emp1,emp2,emp3,emp4,emp5,emp6,emp7,emp8);<br />　　怎么样？很方便吧！<br />　　<br />　　<br />　　第三种 复合分区：<br />　　这是一种将前两种分区综合在一起使用的方法，例如：<br />　　drop table emp;<br />　　create table emp (<br />　　empno number(4),<br />　　ename varchar2(30),<br />　　hiredate date)<br />　　partition by range (hiredate)<br />　　subpartition by hash (empno)<br />　　subpartitions 2<br />　　(partition e1 values less than (to_date(20020501,YYYYMMDD)),<br />　　partition e2 values less than (to_date(20021001,YYYYMMDD)),<br />　　partition e3 values less than (maxvalue));<br />　　上面的例子中将雇员表先按照雇佣时间hiredate进行了范围分区，然后再把每个分区分为两个子hash分区。例子中一共将产生6个分区。<br />　　<br />　　第四种 列表分区：<br />　　这是Oracle 9i的新特性，有了这种分区使得我们可以方便的按照值来将数据分为更小的片断。<br />　　例如：<br />　　drop table emp;<br />　　create table emp (<br />　　empno number(4),<br />　　ename varchar2(30),<br />　　location varchar2(30))<br />　　partition by list (location)<br />　　(partition e1 values (北京),<br />　　partition e2 values (上海,天津,重庆),<br />　　partition e3 values (广东,福建));<br />　　这里说明一下，列表分区不能有maxvalue，当你试图insert列表中不存在的值的时候，Oracle会拒绝这条纪录（ORA-14400）。<br />　　怎么样？看出列表分区很有用了吧？这么方便的东东居然是Oracle9i的New Feature，分特！<br />　　<br />　　上面列出了Oracle9i中使用分区的四种方法，其中的例子很简单，真正工作中具体使用那种分区方法要参考你的具体需求。<br />　　<br />　　注：例子中使用的e1,e2,e3,e4等是分区名称，emp1,emp2,emp3,emp4等是表空间名称。 <br /><img src ="http://www.blogjava.net/sowill/aggbug/78146.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sowill/" target="_blank">shaka sowill</a> 2006-10-30 21:45 <a href="http://www.blogjava.net/sowill/articles/oracle.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>