海量数据性能优化的一个基本的原则就是“分区”(也有叫“分片”的)。分区思想其实就是平常工做生活中的抽屉原理:咱们把本身的物品按照某种逻辑归置到多个小抽屉中,通常会比混在一个大抽屉中好找;可是小抽屉太多了、或者逻辑混乱了,也可能效果拔苗助长。sql
Teradata的分区语法较为简洁,其中经常使用的是按时间分区,以下例只要添加到create table语句末尾就能够实现2013年整年一天一个分区了(为了省事,能够一次分5-10年):数据库
PARTITION BY RANGE_N( 性能优化
Rcd_Dt BETWEEN DATE '2013-01-01' AND DATE '2013-12-31'ide
EACH INTERVAL '1' DAY, NO RANGE性能
); 优化
另一个经常使用(可是不容易掌握)的是按字符串取值分区。在上述按时间分区中咱们能够看到RANGE_N关键字。按值分区采用CASE_N关键字,以下例所示:spa
PARTITION BY CASE_N( 开发
(CASE WHEN (my_field='A') THEN (1) ELSE (0) END)=1, 字符串
(CASE WHEN (my_field='B') THEN (2) ELSE (0) END)=2, string
(CASE WHEN (my_field='C') THEN (3) ELSE (0) END)=3,
NO CASE OR UNKNOWN);
更进一步,其中以下面的语法元素:
my_field='A'
能够修改成相似于这样的形式:
SUBSTR(my_field,1,1) IN ('E','F','G')
在现实中,由于访问数据从全表扫描变成了分区扫描的缘由,某些步骤能够达成10-100倍的性能提高。对于复杂的耗时较长的大做业,也老是可以缩短一半以上的运行时间。很是有意思的现象是,即便是经验丰富的开发人员,对数据分区的掌握也不必定很好。数据分区理念是超越具体数据库的,不管是Teradata仍是别的什么数据库,在我过去将近十年的职业生涯中,大多数性能问题均可以经过数据分区得以妥善解决。