海量資料效能最佳化的一個基本的原則就是“分區”也有叫“分區”的)。分區思想其實就是日常工作生活中的抽屜原理:我們把自己的物品按照某種邏輯歸置到多個小抽屜中,一般會比混在一個大抽屜中好找;但是小抽屜太多了、或者邏輯混亂了,也可能效果適得其反。
Teradata的分區文法較為簡潔,其中常用的是按時間分區,如下例只要添加到create table語句末尾就可以實現2013年全年一天一個分區了為了省事,可以一次分5-10年):
PARTITION BY RANGE_N(
Rcd_Dt BETWEEN DATE '2013-01-01' AND DATE '2013-12-31'
EACH INTERVAL '1' DAY, NO RANGE
);
另外一個常用但是不容易掌握)的是按字串取值分區。在上述按時間分區中我們可以看到RANGE_N關鍵字。按值分區採用CASE_N關鍵字,如下例所示:
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,
(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還是別的什麼資料庫,在我過去將近十年的職業生涯中,大多數效能問題都可以通過資料分區得以妥善解決。
本文出自 “iData” 部落格,請務必保留此出處http://idata.blog.51cto.com/4581576/1188058