经常使用的两种数据分区方法(以Teradata为例)

海量数据性能优化的一个基本的原则就是“分区”(也有叫“分片”的)。分区思想其实就是平常工做生活中的抽屉原理:咱们把本身的物品按照某种逻辑归置到多个小抽屉中,通常会比混在一个大抽屉中好找;可是小抽屉太多了、或者逻辑混乱了,也可能效果拔苗助长。sql

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

  
  
  
  
  1. PARTITION BY RANGE_N(  性能优化

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

  3.     EACH INTERVAL '1' DAY, NO RANGE性能

  4. ); 优化

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

  
  
  
  
  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,    string

  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仍是别的什么数据库,在我过去将近十年的职业生涯中,大多数性能问题均可以经过数据分区得以妥善解决。

相关文章
相关标签/搜索