常用的兩種數據分區方法(以Teradata爲例)

海量數據性能優化的一個基本的原則就是“分區”(也有叫“分片”的)。分區思想其實就是日常工作生活中的抽屜原理:我們把自己的物品按照某種邏輯歸置到多個小抽屜中,一般會比混在一個大抽屜中好找;但是小抽屜太多了、或者邏輯混亂了,也可能效果適得其反。

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還是別的什麼數據庫,在我過去將近十年的職業生涯中,大多數性能問題都可以通過數據分區得以妥善解決。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章