海量數據性能優化的一個基本的原則就是「分區」(也有叫「分片」的)。分區思想其實就是平常工做生活中的抽屜原理:咱們把本身的物品按照某種邏輯歸置到多個小抽屜中,通常會比混在一個大抽屜中好找;可是小抽屜太多了、或者邏輯混亂了,也可能效果拔苗助長。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仍是別的什麼數據庫,在我過去將近十年的職業生涯中,大多數性能問題均可以經過數據分區得以妥善解決。