ApsaraDBForGreenplum試用指南
在ApsaraDB獲取到一個GP例項後,會得到以下資訊:
-
連線地址
分為公網和私網,暫時不考慮VPC。私網地址只能通過阿里雲ECS訪問,公網地址則可以通過網際網路上任一主機訪問。例如:
公網地址:mygpdbpub.gpdb.rds.aliyuncs.com:3568 私網地址:mygpdb.gpdb.rds.aliyuncs.com:3432
-
賬號密碼
賬號:mygpdb 密碼:mygpdb
有了這些資訊後,就可以連線到GP例項上進行相關的操作。
連線
GP目前基於的是PostgreSQL 8.3,完整支援PG 8.3的訊息協議。因此,在各種操作下,與PG幾無二致。
得益於PG 9.4訊息協議的良好向後相容性,所有基於PG 8.3以及之後的連線工具,大部分可以直接用於連線到GP,包括libpq、JDBC、ODBC、psycopg2、pgadmin III等。
GP官網提供了一個安裝包,包含了JDBC、ODBC和libpq,方便安裝和使用。請參考官方文件
psql && pgAdmin III
連線PG和GP,最為常用的莫過於psql和pgAdmin III了。psql是PG、GP安裝後自帶的類shell終端,可以執行所提供的諸多命令和SQL。以psql為例如:
$ ~/workspace/pgsql/bin/psql -h mygpdbpub.gpdb.rds.aliyuncs.com -p 3568 -d postgres -U mygpdb
Password for user mygpdb:
psql (9.4.4, server 8.3devel)
Type "help" for help.
postgres=> select version();
version
-----------------------------------------------------------------------------------------------
PostgreSQL 8.3devel (Greenplum Database 4.3.99.00 build dev) compiled on May 10 2016 01:19:10
(1 row)
postgres=>
其中,“-h”指定主機地址,“-p”指定埠號,“-d“指定資料庫(預設的資料庫是postgres),“-U”指定連線的使用者。更多選項,通過“psql –help”可以看到。
在psql中,可以執行”?”檢視更多psql中支援的命令。
pgAdmin III是圖形客戶端,相對簡單,請參考或中文版。
JDBC
PostgreSQL的官方JDBC可以在這裡下載到,下載之後加入到環境變數中即可。
程式碼案例:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class gp_conn {
public static void main(String[] args) {
try {
Class.forName("org.postgresql.Driver");
Connection db = DriverManager.getConnection("jdbc:postgresql://mygpdbpub.gpdb.rds.aliyuncs.com:3568/postgres","mygpdb","mygpdb");
Statement st = db.createStatement();
ResultSet rs = st.executeQuery("select * from gp_segment_configuration;");
while (rs.next()) {
System.out.print(rs.getString(1));
System.out.print(" | ");
System.out.print(rs.getString(2));
System.out.print(" | ");
System.out.print(rs.getString(3));
System.out.print(" | ");
System.out.print(rs.getString(4));
System.out.print(" | ");
System.out.print(rs.getString(5));
System.out.print(" | ");
System.out.print(rs.getString(6));
System.out.print(" | ");
System.out.print(rs.getString(7));
System.out.print(" | ");
System.out.print(rs.getString(8));
System.out.print(" | ");
System.out.print(rs.getString(9));
System.out.print(" | ");
System.out.print(rs.getString(10));
System.out.print(" | ");
System.out.println(rs.getString(11));
}
rs.close();
st.close();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
詳細文件請參考。
ODBC
PostgreSQL的ODBC是以LGPL協議開源的版本,可以在這裡下載到。
也可以參考德哥的部落格,裡面有更詳細的方法和案例。
Python
Python連線GP和PG用的庫是psycopg2。安裝方法很簡單:
yum -y install python-psycopg2
或者
pip install psycopg2
或者從原始碼安裝
yum install -y postgresql-devel*
wget http://initd.org/psycopg/tarballs/PSYCOPG-2-6/psycopg2-2.6.tar.gz
tar xf psycopg2-2.6.tar.gz
cd psycopg2-2.6
python setup.py build
sudo python setup.py install
安裝後,設定PYTHONPATH,之後就可以引用,如:
import psycopg2
sql = `select * from gp_segment_configuration;`
conn = psycopg2.connect(database=`gpdb`, user=`mygpdb`, password=`mygpdb`, host=`mygpdbpub.gpdb.rds.aliyuncs.com`, port=3568)
conn.autocommit = True
cursor = conn.cursor()
cursor.execute(sql)
rows = cursor.fetchall()
for row in rows:
print row
conn.commit()
conn.close()
會得到類似以下的結果:
(1, -1, `p`, `p`, `s`, `u`, 3022, `192.168.2.158`, `192.168.2.158`, None, None)
(6, -1, `m`, `m`, `s`, `u`, 3019, `192.168.2.47`, `192.168.2.47`, None, None)
(2, 0, `p`, `p`, `s`, `u`, 3025, `192.168.2.148`, `192.168.2.148`, 3525, None)
(4, 0, `m`, `m`, `s`, `u`, 3024, `192.168.2.158`, `192.168.2.158`, 3524, None)
(3, 1, `p`, `p`, `s`, `u`, 3023, `192.168.2.158`, `192.168.2.158`, 3523, None)
(5, 1, `m`, `m`, `s`, `u`, 3026, `192.168.2.148`, `192.168.2.148`, 3526, None)
libpq
libpq是PostgreSQL原生支援用於連線PG的C庫。在安裝了GP或者PG之後,在其lib目錄下可以找到其的靜態庫和動態庫。這裡有很多例子,此處不再列舉。
常規操作
對GP的操作,整體與PG相較為一致,包括schema、型別支援、使用者許可權等。除了GP自身的一些特有的操作,如分佈表、AO表等,其他操作皆可參考PG。
當前ApsaraDB For Greenplum對並沒有開放DB例項的superuser許可權,對應的則是rds_superuser,這一點與ApsaraDB For RDS(PostgreSQL)中的許可權體系一致。
建立DB
Greenplum中建立DB的操作與PG相同,可以通過SQL來執行,如psql連線到GP後執行:
=> create database mygpdb;
CREATE DATABASE
=> c mygpdb
psql (9.4.4, server 8.3devel)
You are now connected to database "mygpdb" as user "mygpdb".
mygpdb=> create extension postgis;
CREATE EXTENSION
建立分佈表
在GP中,表是分佈在所有的Segment上的,其分佈規則是HASH或者隨機。在建表的時候,指定分佈鍵;當匯入資料的時候,會根據分佈鍵計算得到的HASH值分配到特定的Segment上。
=> create table vtbl(id serial, key integer, value text, comment text) distributed by (key);
CREATE TABLE
當不指定分佈鍵的時候(即不帶後面的”distributed by (key)”),GP會預設對id欄位以round-robin的方式進行隨機分配。
分佈鍵
分佈鍵對於查詢效能至關重要。均勻為分佈鍵選擇的第一大原則,選取更有業務意義的欄位,並非必須選擇原庫的主鍵。參考中,《Greenplum 資料庫最佳實踐》做了很好的說明。
查詢
構造資料:
- 建立隨機字串生成函式和型別
CREATE OR REPLACE FUNCTION random_string(integer) RETURNS text AS $body$
SELECT array_to_string(array
(SELECT substring(`0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz`
FROM (ceil(random()*62))::int
FOR 1)
FROM generate_series(1, $1)), ``); $body$ LANGUAGE SQL VOLATILE;
CREATE TYPE cuboid AS (LENGTH integer, width integer, height integer);
- 建立分佈表和構造資料
CREATE TABLE tbl(id serial, KEY integer, value text, shape cuboid, locate geometry, COMMENT text) distributed by (key);
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;
- 查詢
=> select * from vtbl where key = 13944;
id | key | value | shape | locate | comment
--------+-------+-------+--------------+--------------------------------------------+----------------
113944 | 13944 | red | (84,102,206) | 01010000000000000000405D400000000000C05140 | 22EaPlVqvfSgpq
(1 row)
Time: 513.101 ms
- PG上的查詢
=> select * from tbl where key = 13944;
id | key | value | shape | locate | comment
-------+-------+-------+--------------+--------------------------------------------+--------------
13944 | 13944 | green | (55,105,207) | 01010000000000000000C05C400000000000004C40 | 3wQrCJqnHPds
(1 row)
Time: 1162.243 ms
在同樣的表結構、記錄數和沒有新增任何索引的情況下,GP的查詢要比PG的快一些。這個GP的例項是兩個Segments,當記錄數更多、Segments更多的時候,理論上差距會更明顯。
參考
相關文章
- 潤乾報表試用指南
- 程式碼測試用例指南
- 測試用例設計指南
- Web應用程式完全測試指南Web
- [譯] 測試 React & Redux 應用良心指南ReactRedux
- 移動端App測試實用指南APP
- 測試工程師,避免試用期被辭退指南工程師
- React 測試指南React
- 七牛雲試用指南-單檔案直傳(原理)
- 七牛雲試用指南-單檔案直傳(實踐)
- React Hook測試指南ReactHook
- Mousejack測試指南
- 實用指南:使用Pytest Allure測試框架新增用例失敗截圖框架
- 安全無休|綠盟科技SaaS安全服務免費試用指南
- 《Android應用測試指南》——第2章,第2.1節JunitAndroid
- 資料庫測試指南資料庫
- Metasploit滲透測試指南
- A/B測試終極指南
- 故障測試入門指南
- 《黑客祕笈——滲透測試實用指南》讀書筆記(1)黑客筆記
- Git 實用指南Git
- 1688 API介面測試指南API
- 自動化測試框架指南框架
- API 測試 | 瞭解 API 介面測試 | API 介面測試指南API
- API測試:瞭解API介面測試與API介面測試指南API
- .Net單元測試xUnit和整合測試指南(1)
- 最實用VS code開發測試利器,超詳細python配置指南Python
- Postman之API測試使用全指南PostmanAPI
- API測試之Postman使用全指南APIPostman
- [譯] 快速,完整的 Mocha 測試指南
- Android UI 測試指南之 EspressoAndroidUIEspresso
- 滲透測試(PenTest)基礎指南
- Django REST framework API 指南(26):測試DjangoRESTFrameworkAPI
- 模糊測試: 初學者入門指南
- ABX盲聽測試指南.18176383
- React Hooks 實用指南ReactHook
- webpack SplitChunksPlugin實用指南WebPlugin
- DataBinding實用指南