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

基础操作

更新时间: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

参考

本文导读目录