在创建完分区表后,可以向分区表中直接插入数据,而不用去管它这些数据放在哪个物理上的数据表中。接上篇文章,我们在创建好的分区表中插入几条数据:

 

 

如果你的数据库中某一个表中的数据满足以下几个条件,那么你就要考虑创建分区表了。

  
 从以上代码中可以看出,我们一共在数据表中插入了13条数据,其中第1至3条数据是插入到第1个物理分区表中的;第4、5条数据是插入到第2个物理分区表中的;第6至8条数据是插入到第3个物理分区表中的;第9至11条数据是插入到第4个物理分区表中的;第12、13条数据是插入到第5个物理分区表中的。

 

  
 从SQL语句中可以看出,在向分区表中插入数据方法和在普遍表中插入数据的方法是完全相同的,对于程序员而言,不需要去理会这13条记录研究放在哪个数据表中。当然,在查询数据时,也可以不用理会数据到底是存放在哪个物理上的数据表中。如使用以下SQL语句进行查询:

  
 1、数据库中某个表中的数据很多。很多是什么概念?一万条?两万条?还是十万条、一百万条?这个,我觉得是仁者见仁、智者见智的问题。当然数据表中的数据多到查询时明显感觉到数据很慢了,那么,你就可以考虑使用分区表了。如果非要我说一个数值的话,我认为是100万条。

 

  
 2、但是,数据多了并不是创建分区表的惟一条件,哪怕你有一千万条记录,但是这一千万条记录都是常用的记录,那么最好也不要使用分区表,说不定会得不偿失。只有你的数据是分段的数据,那么才要考虑到是否需要使用分区表。

[c-sharp] view plaincopy 

  
 3、什么叫数据是分段的?这个说法虽然很不专业,但很好理解。比如说,你的数据是以年为分隔的,对于今年的数据而言,你常进行的操作是添加、修改、删除和查询,而对于往年的数据而言,你几乎不需要操作,或者你的操作往往只限于查询,那么恭喜你,你可以使用分区表。换名话说,你对数据的操作往往只涉及到一部分数据而不是所有数据的话,那么你就可以考虑什么分区表了。

  1. select * from Sale  

 

 

    那么,什么是分区表呢?

 

  
 简单一点说,分区表就是将一个大表分成若干个小表。假设,你有一个销售记录表,记录着每个每个商场的销售情况,那么你就可以把这个销售记录表按时间分成几个小表,例如说5个小表吧。2009年以前的记录使用一个表,2010年的记录使用一个表,2011年的记录使用一个表,2012年的记录使用一个表,2012年以后的记录使用一个表。那么,你想查询哪个年份的记录,就可以去相对应的表里查询,由于每个表中的记录数少了,查询起来时间自然也会减少。

    查询的结果如下图所示:

  
 但将一个大表分成几个小表的处理方式,会给程序员增加编程上的难度。以添加记录为例,以上5个表是独立的5个表,在不同时间添加记录的时候,程序员要使用不同的SQL语句,例如在2011年添加记录时,程序员要将记录添加到2011年那个表里;在2012年添加记录时,程序员要将记录添加到2012年的那个表里。这样,程序员的工作量会增加,出错的可能性也会增加。 

永利皇宫登录网址 1

  
 使用分区表就可以很好的解决以上问题。分区表可以从物理上将一个大表分成几个小表,但是从逻辑上来看,还是一个大表。

  
 从上面两个步骤中,根本就感觉不到数据是分别存放在几个不同的物理表中,因为在逻辑上,这些数据都属于同一个数据表。如果你非想知道哪条记录是放在哪个物理上的分区表中,那么就必须使用到$PARTITION函数,这个函数的可以调用分区函数,并返回数据所在物理分区的编号。

  
 接着上面的例子,分区表可以将一个销售记录表分成五个物理上的小表,但是对于程序员而言,他所面对的依然是一个大表,无论是2010年添加记录还是2012年添加记录,对于程序员而言是不需要考虑的,他只要将记录插入到销售记录表——这个逻辑中的大表里就行了。SQL
Server会自动地将它放在它应该呆在的那个物理上的小表里。

    说起来有点难懂,不过用起来很简单。$PARTITION的语法是:

    同样,对于查询而言,程序员也只需要设置好查询条件,OK,SQL
Server会自动将去相应的表里查询,不用管太多事了。

    $PARTITION.分区函数名(表达式)

 

  
 假设,你想知道2010年10月1日的数据会放在哪个物理分区表中,你就可以使用以下语句来查看。

    这一切是不是很诱人?

 

    的确,那么我们就可以开始动手创建分区表了。

[c-sharp] view plaincopy 

 

  1. select $PARTITION.partfunSale (‘2010-10-1’)  

  
 第一、创建分区表的第一步,先创建数据库文件组,但这一步可以省略,因为你可以直接使用PRIMARY文件。但我个人认为,为了方便管理,还是可以先创建几个文件组,这样可以将不同的小表放在不同的文件组里,既便于理解又可以提高运行速度。创建文件组的方法很简单,打开SQL
Server Management
Studio,找到分区表所在数据库,右键单击,在弹出的菜单里选择“属性”。然后选择“文件组”选项,再单击下面的“添加”按钮,如下图所示:

 

 

 

永利皇宫登录网址 2

  
 在以上语句中,partfunSale()为分区函数名,括号中的表达式必须是日期型的数据或可以隐式转换成日期型的数据,如果要问我为什么,那么就回想一个怎么定义分区函数的吧(CREATE PARTITION FUNCTION partfunSale (datetime))。在定义partfunSale()函数时,指定了参数为日期型,所以括号中的表达式必须是日期型或可以隐式转换成日期型的数据。以上代码的运行结果如下图所示:

 

永利皇宫登录网址 3

  
 第二,创建了文件组之后,还要再创建几个数据库文件。为什么要创建数据库文件,这很好理解,因为分区的小表必须要放在硬盘上,而放在硬盘上的什么地方呢?当然是文件里啦。再说了,文件组中没有文件,文件组还要来有啥用呢?还是在上图的那个界面,选择“文件”选项,然后添加几个文件。在添加文件的时候要注意以下几点:

  
 在该图中可以看出,分区函数返回的结果为2,也就是说,2010年10月1日的数据会放在第2个物理分区表中。

  
 1、不要忘记将不同的文件放在文件组中。当然一个文件组中也可以包含多个不同的文件。

 

  
 2、如果可以的话,将不同的文件放在不同的硬盘分区里,最好是放在不同的独立硬盘里。要知道IQ的速度往往是影响SQL
Server运行速度的重要条件之一。将不同的文件放在不同的硬盘上,可以加快SQL
Server的运行速度。

  
 再进一步考虑,如果想具体知道每个物理分区表中存放了哪些记录,也可以使用$PARTITION函数。因为$PARTITION函数可以得到物理分区表的编号,那么只要将$PARTITION.partfunSale(SaleTime)做为where的条件使用即可,如以下代码
所示:

  
 在本例中,为了方便起见,将所有数据库文件都放在了同一个硬盘下,并且每个文件组中只有一个文件。如下图所示。

 

永利皇宫登录网址 4

[c-sharp] view plaincopy 

 

  1. select * from Sale where $PARTITION.partfunSale(SaleTime)=1  
  2. select * from Sale where $PARTITION.partfunSale(SaleTime)=2  
  3. select * from Sale where $PARTITION.partfunSale(SaleTime)=3  
  4. select * from Sale where $PARTITION.partfunSale(SaleTime)=4  
  5. select * from Sale where $PARTITION.partfunSale(SaleTime)=5  

  
 第三、创建一个分区函数。这一步是必须的了,创建分区函数的目的是告诉SQL
Server以什么方式对分区表进行分区。这一步必须要什么SQL脚本来完成。以上面的例子,我们要将销售表按时间分成5个小表。假设划分的时间为:

 

    第1个小表:2010-1-1以前的数据(不包含2010-1-1)。

 

    第2个小表:2010-1-1(包含2010-1-1)到2010-12-31之间的数据。

    以上代码的运行结果如下图所示:

    第3个小表:2011-1-1(包含2011-1-1)到2011-12-31之间的数据。

永利皇宫登录网址 5

    第4个小表:2012-1-1(包含2012-1-1)到2012-12-31之间的数据。

  
 从上图中我们可以看到每个分区表中的数据记录情况——和我们插入时设置的情况完全一致。同理可得,如果要统计每个物理分区表中的记录数,可以使用如下代码:

    第5个小表:2013-1-1(包含2013-1-1)之后的数据。

 

    那么分区函数的代码如下所示:

[c-sharp] view plaincopy 

 

  1. select $PARTITION.partfunSale(SaleTime) as 分区编号,count(id) as 记录数 from Sale group by $PARTITION.partfunSale(SaleTime)  

[c-sharp] view
plaincopy

 

 

 

  1. CREATE PARTITION FUNCTION partfunSale (datetime)  
  2. AS RANGE RIGHT FOR VALUES (‘20100101′,’20110101′,’20120101′,’20130101’)  

    以上代码的运行结果如下图所示:

 

永利皇宫登录网址 6

 

 

    其中:

  
 除了在插入数据时程序员不需要去考虑分区表的物理情况之外,就是连修改数据也不需要考虑。SQL
Server会自动将记录从一个分区表移到另一个分区表中,如以下代码所示:

    1、CREATE PARTITION FUNCTION意思是创建一个分区函数。

网站地图xml地图