阅读484 返回首页    go iPhone_iPad_Mac_手机_平板_苹果apple


基础操作(建库、建分布式分区表)__快速入门_云数据库 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-阿里云