全部产品
弹性计算 会员服务 网络 安全 移动云 数加·大数据分析及展现 数加·大数据应用 管理与监控 云通信 阿里云办公 培训与认证 ET大脑 更多
存储与CDN 数据库 域名与网站(万网) 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 开发者工具 解决方案 物联网 智能硬件
HybridDB for PostgreSQL

基础操作

更新时间:2017-11-08 17:16:56

对基于 Greenplum Database 的操作,HybridDB for PostgreSQL 与 Greenplum Database 开源数据库基本一致,包括 schema、类型支持、用户权限等。除 Greenplum Database 开源数据库一些特有的操作,如分布键、AO表等,其它操作皆可参见 PostgreSQL。

本文介绍了 HybridDB for PostgreSQL 的基础操作:创建数据库、创建分布键和查询。

创建数据库

HybridDB for PostgreSQL 中创建数据库的操作与 PostgreSQL 相同,可以通过 SQL 来执行,如在 psql 连接到 Greenplum 后执行如下命令:

  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".

创建分布键

在 HybridDB for PostgreSQL 中,表分布在所有的 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)”时),Greenplum 会默认对 id 字段以 round-robin 的方式进行随机分配。

关于分布键

分布键对于查询性能至关重要。“均匀”为分布键选择的第一大原则,选取更有业务意义的字段,将有助于显著提高性能。

  • 尽量选择分布均匀的列、或者多列,以防止数据倾斜。

  • 尽量选择常用于连接运算的字段,对于并发较高的语句,该选择更为重要。

  • 尽量选择高并发查询、过滤性高的条件列。

  • 尽量不要轻易使用随机分布。

详细内容,请参见本文档 参考 中内容。

构造数据

  1. 创建函数,用于生成随机字符串。

    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)), '');
    7. $body$
    8. LANGUAGE SQL VOLATILE;
  2. 创建分布键。

    1. CREATE TABLE tbl(id serial, KEY integer, locate geometry, COMMENT text) distributed by (key);
  3. 构造数据。

    1. INSERT INTO tbl(KEY, COMMENT, locate)
    2. SELECT
    3. KEY,
    4. COMMENT,
    5. ST_GeomFromText(locate) AS locate
    6. FROM
    7. (SELECT
    8. (a + 1) AS KEY,
    9. random_string(ceil(random() * 24)::integer) AS COMMENT,
    10. 'POINT(' || ceil(random() * 36 + 99) || ' ' || ceil(random() * 24 + 50) || ')' AS locate
    11. FROM
    12. generate_series(0, 99999) AS a)
    13. AS t;

查询示例

  • 查询

    1. => select * from tbl where key = 751;
    2. | id | key | value | shape | locate | comment |
    3. +-----+-----+-------+--------------+--------------------------------------------+----------------+
    4. | 751 | 751 | red | 01010000000000000000C05B400000000000004A40 | B9hPhjeNWPqV |
    5. (1 row)
    6. Time: 513.101 ms
  • 查询计划

    1. => explain select * from tbl where key = 751;
    2. Gather Motion 1:1 (slice1; segments: 1) (cost=0.00..1519.28 rows=1 width=53)
    3. -> Seq Scan on tbl (cost=0.00..1519.28 rows=1 width=53)
    4. Filter: key = 751
    5. Settings: effective_cache_size=8GB; gp_statistics_use_fkeys=on
    6. Optimizer status: legacy query optimizer

参考

本文导读目录