閱讀484 返回首頁    go 魔獸


基礎操作(建庫、建分布式分區表)__快速入門_雲數據庫 HybridDB-阿裏雲

雲數據庫HybridDB(ApsaraDB HybridDB)是一種在線MPP大規模並行處理數據倉庫服務。雲數據庫HybridDB基於Greenplum Database開源數據庫項目,並由阿裏雲深度擴展支持OSS存儲、JSON數據類型、HyperLogLog預估分析等功能特性。

對基於Greenplum Database的操作,整體與Greenplum Database開源數據庫一致,包括schema、類型支持、用戶權限等。除了Greenplum Database開源數據庫自身的一些特有的操作,如分布表、AO表等,其他操作皆可參考PostgreSQL。

當前雲數據庫HybridDB對並沒有開放DB實例的superuser權限,對應的則是rds_superuser,這一點與ApsaraDB For RDS(PostgreSQL)中的權限體係一致。

創建DB

雲數據庫HybridDB中創建DB的操作與PG相同,可以通過SQL來執行,如psql連接到GP後執行:

  1. => create database mygpdb;
  2. CREATE DATABASE
  3. => c mygpdb
  4. psql (9.4.4, server 8.3devel)
  5. You are now connected to database "mygpdb" as user "mygpdb".
  6. mygpdb=>

創建分布表

雲數據庫HybridDB中,表是分布在所有的Segment上的,其分布規則是HASH或者隨機。在建表的時候,指定分布鍵;當導入數據的時候,會根據分布鍵計算得到的HASH值分配到特定的Segment上。

  1. => create table vtbl(id serial, key integer, value text, shape cuboid, location geometry, comment text) distributed by (key);
  2. CREATE TABLE

當不指定分布鍵的時候(即不帶後麵的”distributed by (key)”),GP會默認對id字段以round-robin的方式進行隨機分配。

分布鍵

分布鍵對於查詢性能至關重要。均勻為分布鍵選擇的第一大原則,選取更有業務意義的字段,並非必須選擇原庫的主鍵。參考中,《Greenplum 數據庫最佳實踐》做了很好的說明。

查詢

構造數據:

  • 創建隨機字符串生成函數和類型
  1. CREATE OR REPLACE FUNCTION random_string(integer) RETURNS text AS $body$
  2. SELECT array_to_string(array
  3. (SELECT substring('0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
  4. FROM (ceil(random()*62))::int
  5. FOR 1)
  6. FROM generate_series(1, $1)), ''); $body$ LANGUAGE SQL VOLATILE;
  7. CREATE TYPE cuboid AS (LENGTH integer, width integer, height integer);
  • 創建分布表和構造數據
  1. CREATE TABLE tbl(id serial, KEY integer, value text, shape cuboid, locate geometry, COMMENT text) distributed by (key);
  2. INSERT INTO tbl(KEY, COMMENT, shape, locate, value) SELECT KEY, COMMENT, shape, ST_GeomFromText(locate) AS locate, value FROM (SELECT (a.t + 1) AS KEY, random_string(ceil(random() * 24)::integer) AS COMMENT, row(ceil(random() * 36 + 49), ceil(random() * 6 + 99), ceil(random() * 12 + 199))::cuboid AS shape, 'POINT(' || ceil(random() * 36 + 99) || ' ' || ceil(random() * 24 + 50) || ')' AS locate, (CASE WHEN a.b = 1 THEN 'red' WHEN a.b = 2 THEN 'green' WHEN a.b = 3 THEN 'yellow' WHEN a.b = 4 THEN 'blue' END) AS value FROM (SELECT ceil(random() * 4) b, t FROM generate_series(0, 99999) AS t) AS a) AS t;
  • 查詢
  1. => select * from vtbl where key = 13944;
  2. id | key | value | shape | locate | comment
  3. --------+-------+-------+--------------+--------------------------------------------+----------------
  4. 113944 | 13944 | red | (84,102,206) | 01010000000000000000405D400000000000C05140 | 22EaPlVqvfSgpq
  5. (1 row)
  6. Time: 513.101 ms
  • PG上的查詢
  1. => select * from tbl where key = 13944;
  2. id | key | value | shape | locate | comment
  3. -------+-------+-------+--------------+--------------------------------------------+--------------
  4. 13944 | 13944 | green | (55,105,207) | 01010000000000000000C05C400000000000004C40 | 3wQrCJqnHPds
  5. (1 row)
  6. Time: 1162.243 ms

在同樣的表結構、記錄數和沒有添加任何索引的情況下,GP的查詢要比PG的快一些。這個GP的實例是兩個Segments,當記錄數更多、Segments更多的時候,理論上差距會更明顯。

參考

  1. Pivotal Greenplum官方文檔
  2. 《GP 4.3 Best Practice》

最後更新:2016-12-01 11:04:17

  上一篇:go 功能與限製__快速入門_雲數據庫 HybridDB-阿裏雲
  下一篇:go 用戶權限管理__快速入門_雲數據庫 HybridDB-阿裏雲