海量数据性能优化的一个基本的原则就是“分区”(也有叫“分片”的)。分区思想其实就是日常工作生活中的抽屉原理:我们把自己的物品按照某种逻辑归置到多个小抽屉中,一般会比混在一个大抽屉中好找;但是小抽屉太多了、或者逻辑混乱了,也可能效果适得其反。

Teradata的分区语法较为简洁,其中常用的是按时间分区,如下例只要添加到create table语句末尾就可以实现2013年全年一天一个分区了(为了省事,可以一次分5-10年)

   
   
   
   
  1. PARTITION BY RANGE_N(  

  2.     Rcd_Dt BETWEEN DATE '2013-01-01' AND DATE '2013-12-31'

  3.     EACH INTERVAL '1' DAY, NO RANGE

  4. ); 

另外一个常用(但是不容易掌握)的是按字符串取值分区。在上述按时间分区中我们可以看到RANGE_N关键字。按值分区采用CASE_N关键字,如下例所示:

   
   
   
   
  1. PARTITION BY CASE_N(   

  2.  (CASE WHEN (my_field='A'THEN (1) ELSE (0) END)=1,    

  3.  (CASE WHEN (my_field='B'THEN (2) ELSE (0) END)=2,    

  4.  (CASE WHEN (my_field='C'THEN (3) ELSE (0) END)=3,    

  5. NO CASE OR UNKNOWN);

更进一步,其中如下面的语法元素:

   
   
   
   
  1. my_field='A'

可以修改为类似于这样的形式:

   
   
   
   
  1. SUBSTR(my_field,1,1) IN ('E','F','G'

在现实中,因为访问数据从全表扫描变成了分区扫描的原因,某些步骤可以达成10-100倍的性能提升。对于复杂的耗时较长的大作业,也总是能够缩短一半以上的运行时间。非常有意思的现象是,即使是经验丰富的开发人员,对数据分区的掌握也不一定很好。数据分区理念是超越具体数据库的,无论是Teradata还是别的什么数据库,在我过去将近十年的职业生涯中,大多数性能问题都可以通过数据分区得以妥善解决。