AMP (Access Module Processors)
TD里面最基礎(chǔ)的核心組件之一,它是存儲、計(jì)算TD表中每一行數(shù)據(jù)的基本單位。你會在很多地方看到它的身影。每一個(gè)AMP有自己的一塊內(nèi)存、有自己的一塊計(jì)算資源和自己的一塊磁盤空間。

一條SQL在TD中的執(zhí)行過程

用戶輸入一條SQL,傳遞到PE,PE給出一個(gè)執(zhí)行計(jì)劃(使用explain可以看到),將計(jì)劃執(zhí)行的任務(wù)通過BYNET傳遞到各個(gè)AMP中同步執(zhí)行,AMP執(zhí)行然后返回到PE中,PE匯總返回給用戶。
TD索引
Single-AMP Retrieved是指TD可以快速的將數(shù)據(jù)定位在一個(gè)AMP中去獲取,是一種非常快的執(zhí)行計(jì)劃。一瞬間就定位到數(shù)據(jù)所在的成千上萬的AMP中的一個(gè),然后馬上取出返回。這速度你說快不快。
Unique Primary Index
唯一主鍵索引,和大部分的其他數(shù)據(jù)庫的索引一樣。當(dāng)你設(shè)置了唯一主鍵索引的好處就是,你能夠非??焖俚亩ㄎ荒愕臄?shù)據(jù),無論數(shù)據(jù)庫中有多大的數(shù)據(jù)量。你在where條件中指定了唯一主鍵索引,然后TD就會把這些數(shù)據(jù)根據(jù)索引的字段均勻的Hash到所有的AMP上去。當(dāng)你執(zhí)行一條SQL時(shí)會達(dá)到,一秒、一行、一個(gè)AMP的效果。
- 字段值不能重復(fù)
- 數(shù)據(jù)均勻分配到各個(gè)AMP
- single AMP Retrieve
None-Unique Primary Index
非唯一主鍵索引,它和唯一主鍵索引不同的點(diǎn)在于能夠插入重復(fù)值。TD會根據(jù)字段值然后利用內(nèi)部的一個(gè)數(shù)學(xué)公式Hash到各個(gè)AMP上去。你會發(fā)現(xiàn)不同的AMP上的數(shù)據(jù)量并不均勻分布。相同字段值的行會存在同一個(gè)AMP中,并且緊密的存放在一起。
- 字段值可以重復(fù)
- 數(shù)據(jù)分布不均,相同索引字段值的數(shù)據(jù)會分布在一個(gè)AMP中
- single AMP Retrieve
Muti-Column Primary Index
多字段組合索引,假設(shè)設(shè)置了一個(gè)聯(lián)合索引(A,B) 那么TD需要這兩個(gè)條件同時(shí)存在的情況下索引才能生效,不存在部分索引生效的情況。TD會根據(jù)兩個(gè)索引的組合一起Hash到特定的AMP中去取數(shù)據(jù)。
- 也有Unique和None Unique兩種類型索引
- 必須全部字段都在where條件中使用時(shí)才能生效
- single AMP Retrieve
No Primary Index
沒有索引的表,但你進(jìn)行數(shù)據(jù)查詢時(shí)就會發(fā)生全表掃描的情況。這是不可避免的。那一般這樣的表的設(shè)計(jì)是為了數(shù)據(jù)的暫存稱為staging區(qū)域,然后你按照你的業(yè)務(wù)需求再插入到自己設(shè)計(jì)的真正的表里面去。
- 全表掃描
- 有特殊的設(shè)計(jì)作用,用于數(shù)據(jù)暫存
- 在建表的時(shí)候需要顯示的指定no Primary index 否則會自動創(chuàng)建默認(rèn)的Primary index
- 數(shù)據(jù)隨機(jī)分布,但是TD會將數(shù)據(jù)很好的均勻的分布到各個(gè)AMP中去
share nothing environment
Teradata的硬件是一個(gè)大小為一個(gè)PC電腦那么大的主機(jī),里面大概有40個(gè)AMP和4個(gè)PE,然后主機(jī)連接到磁盤區(qū)域。每一個(gè)AMP對應(yīng)有一個(gè)自己的磁盤。對應(yīng)的一塊內(nèi)存空間。并且它們之間互相不共享環(huán)境。

Teradata的物理節(jié)點(diǎn)架構(gòu)
我們來梳理一下TD的組成層次結(jié)構(gòu),從最小的AMP開始。
一塊內(nèi)存空間+一些數(shù)據(jù)空間=一個(gè)AMP
一定數(shù)量的AMP+一套Linux操作系統(tǒng)+PDE(parallel database extension)+Gateway+Channel Driver=一個(gè)Node

一定數(shù)量的Node+一定數(shù)量的物理BYNET=一個(gè)cabinet

唯一主索引的執(zhí)行過程
當(dāng)在where條件里面指定了被設(shè)置為Primary index的字段,那么當(dāng)發(fā)生查詢語句時(shí)。就會根據(jù)TD里面的數(shù)學(xué)公式Hash字段值到一個(gè)輸出值上,根據(jù)輸出值在HashMap中找到記錄所在AMP,然后進(jìn)行指定AMP查找對應(yīng)的行數(shù)據(jù)。

非唯一主索引的執(zhí)行過程
跟上面的執(zhí)行過程很類似,唯一不同點(diǎn)在于,rowID由兩部分組成,一部分是RowHash的值,也就是和上面一樣通過字段值被數(shù)學(xué)公式Hash得到的一個(gè)輸出值。還有一部分就是一個(gè)非唯一值。假設(shè)有兩個(gè)同樣字段的不同行數(shù)據(jù)進(jìn)來,那么會被定位到同一個(gè)AMP中。Hash值為3,那么第一個(gè)行數(shù)據(jù)的真實(shí)RowID為3,1 第二個(gè)為3,2。并且相同的RowHash的數(shù)據(jù)會被分組放在一起。

那實(shí)際上唯一主索引就是非唯一主索引的特殊情況,就是它的uniqueness Value一直是1.然后當(dāng)進(jìn)入一個(gè)AMP中去查找對應(yīng)的RowHash值的位置的時(shí)候,它會采用非常高效率的簡單算法,二分搜索。算法復(fù)雜度為log(N)快速定位到相應(yīng)的RowHash的值。