乾貨丨時序數據庫分區教程(一)

1.爲何對數據進行分區?

對數據庫進行分區能夠極大的下降系統響應延遲同時提升數據吞吐量。具體來講,分區有如下幾個好處:數據庫

  • 分區使得大型表更易於管理。對數據子集的維護操做也更加高效,由於這些操做只針對須要的數據而不是整個表。一個好的分區策略將經過只讀取知足查詢所需的相關數據來減小要掃描的數據量。當全部的數據都在同一個分區上,對數據庫的查詢,計算,以及其它操做都會被限制在磁盤訪問IO這個瓶頸上。
  • 分區使得系統能夠充分利用全部資源。一個良好的分區方案搭配並行計算,分佈式計算就能夠充分利用全部節點來完成一般要在一個節點上完成的任務。 當一個任務能夠拆分紅幾個分散的子任務,每一個子任務訪問不一樣的分區,就能夠達到提高效率的目的。
  • 分區增長了系統的可用性。因爲分區的副本一般是存放在不一樣的物理節點的。因此一旦某個分區不可用,系統依然能夠調用其它副本分區來保證做業的正常運轉。

2.分區方式

DolphinDB database支持多種分區方式: 範圍分區(RANGE),哈希分區(HASH),值分區(VALUE),列表分區(LIST),複合分區(COMPO)。app

  • 範圍分區每一個區間建立一個分區,是最經常使用的也是推薦的一種分區方式。能夠把數值在一個區間內的全部記錄放置到一個分區。
  • 哈希分區利用哈希函數對分區列操做,方便創建指定數量的分區。
  • 值分區每一個值建立一個分區,例如股票交易日期,股票交易月。
  • 列表分區是根據用戶枚舉的列表來進行分區,比值分區更加靈活。
  • 複合分區適用於數據量特別大並且查詢常常涉及兩個或以上的分區列。每一個分區選擇均可以採用區間,值或列表分區。例如按股票交易日期進行值分區, 同時按股票代碼進行範圍分區。

咱們能夠使用database函數建立數據庫。分佈式

語法:database(directory, [partitionType], [partitionScheme], [locations])函數

參數spa

directory:數據庫保存的目錄。DolphinDB有三種類型的數據庫,分別是內存數據庫、磁盤上的數據庫和分佈式文件系統上的數據庫。建立內存數據庫,directory爲空;建立本地數據庫,directory應該是本地文件系統目錄;建立分佈式文件系統上的數據庫,directory應該以「dfs://」開頭。本教程以建立Windows本地數據庫爲例。3d

partitionType:分區方式,有5種方式: 範圍分區(RANGE),哈希分區(HASH),值分區(VALUE),列表分區(LIST),複合分區(COMPO)。code

partitionScheme:分區方案。各類分區方式對應的分區方案以下:blog

locations:指定每一個分區所在的節點位置。若是是分佈式文件系統的數據庫或者複合分區(COMPO)類型的數據庫,不能使用locations參數。教程

 

2.1 範圍分區內存

範圍分區是由分區向量決定。分區向量表示區間,包含起始值,不包含結尾值。

在下面的例子中,數據庫db有兩個分區:[0,5)和[5,10)。使用函數append!在數據庫db中保存表t爲分區表pt,並使用ID做爲分區列。

n=1000000
ID=rand(10, n)
x=rand(1.0, n)
t=table(ID, x)
db=database("dfs://rangedb", RANGE,  0 5 10)

pt = db.createPartitionedTable(t, `pt, `ID)
pt.append!(t);

pt=loadTable(db,`pt)
select count(x) from pt

 

2.2 哈希分區

哈希分區對分區列使用哈希函數以產生分區。哈希分區是產生指定數量的分區的一個簡便方法。可是要注意,哈希分區不能保證分區的大小一致,尤爲當分區列的值的分佈存在偏態的時候。此外,若要查找分區列上一個連續區域的數據時,哈希分區的效率比區域分區或值分區要低。

在下面的例子中,數據庫db有兩個分區。使用函數append!在數據庫db中保存表t爲分區表pt,並使用ID做爲分區列。

n=1000000
ID=rand(10, n)
x=rand(1.0, n)
t=table(ID, x)
db=database("dfs://hashdb", HASH,  [INT, 2])

pt = db.createPartitionedTable(t, `pt, `ID)
pt.append!(t);

pt=loadTable(db,`pt)
select count(x) from pt

2.3 值分區

值分區用一個值表明一個分區。下面的例子定義了204個分區。每一個分區表示2000年1月到2016年12月之間的一個月。

n=1000000
month=take(2000.01M..2016.12M, n)
x=rand(1.0, n)
t=table(month, x)

db=database("dfs://valuedb", VALUE, 2000.01M..2016.12M)

pt = db.createPartitionedTable(t, `pt, `month)
pt.append!(t)

pt=loadTable(db,`pt)
select count(x) from pt

 

2.4 列表分區

在列表(LIST)分區中,咱們用一個包含多個元素的列表表明一個分區。下面的例子有兩個分區,第一個分區包含3個股票代碼,第二個分區包含2個股票代碼。

n=1000000
ticker = rand(`MSFT`GOOG`FB`ORCL`IBM,n);
x=rand(1.0, n)
t=table(ticker, x)

db=database("dfs://listdb", LIST, [`IBM`ORCL`MSFT, `GOOG`FB])
pt = db.createPartitionedTable(t, `pt, `ticker)
pt.append!(t)

pt=loadTable(db,`pt)
select count(x) from pt

 

2.5 組合分區

組合(COMPO)分區能夠定義2或3個分區列。每列能夠獨立採用範圍(RANGE),值(VALUE)或列表(LIST)分區。組合分區的多個列在邏輯上是並列的,不存在從屬關係或優先級關係。

n=1000000
ID=rand(100, n)
dates=2017.08.07..2017.08.11
date=rand(dates, n)
x=rand(10.0, n)
t=table(ID, date, x)

dbDate = database(, VALUE, 2017.08.07..2017.08.11)
dbID=database(, RANGE, 0 50 100)
db = database("dfs://compoDB", COMPO, [dbDate, dbID])
pt = db.createPartitionedTable(t, `pt, `date`ID)
pt.append!(t)

pt=loadTable(db,`pt)
select count(x) from pt

上面的例子建立了5個值分區。

在20170807這個分區,有2個範圍分區。

 

DolphinDB分區數據庫教程(二)將會介紹DolphinDB分區原則以及特殊的分區方案。

相關文章
相關標籤/搜索