数据仓库服务GaussDB(DWS) 是一种基于华为云基础架构和平台的在线数据处理数据库,提供即开即用、可扩展且完全托管的分析型数据库服务。GaussDB(DWS)是基于华为融合数据仓库GaussDB产品的云原生服务 ,兼容标准ANSI SQL 99和SQL 2003,同时兼容PostgreSQL/Oracle数据库生态,为各行业PB级海量大数据分析提供有竞争力的解决方案。
GaussDB(DWS) 可广泛应用于金融、车联网、政企、电商、能源、电信等多个领域,已连续两年入选Gartner发布的数据管理解决方案魔力象限,相比传统数据仓库,性价比提升数倍,具备大规模扩展能力和企业级可靠性。
虚拟私有云(Virtual Private Cloud)是用户在华为云上申请的隔离的、私密的虚拟网络环境。用户可以自由配置VPC内的IP地址段、子网、安全组等子服务,也可以申请弹性带宽和弹性IP搭建业务系统。
登录账号后,点击左侧栏“虚拟私有云”
基本信息:
①当前区域:华北-北京四
② 名称:DWS-vpc
③网段:192.168.0.0/16
子网配置:
① 可用分区:可用区1
② 子网名称:subnet-DWS
③ 子网IPv4网段:192.168.0.0/24
④ 子网IPv6网段:默认不勾选
检查创建的虚拟机私有云VPC状态。
点击服务列表->“大数据”->“数据仓库服务GaussDB(DWS)”,进入左侧栏“数据仓库服务”页面。
选择创建数据仓库集群
①计费模式:改为“按需计费”
②区域:华北-北京四。
③ 可用区:可用区1。(如资源售罄,可更换可用区)
④ 产品类型:云数仓。
⑤ 计算类型:弹性云服务器
⑥ 存储类型:SSD云盘
⑦ CPU架构:鲲鹏
⑧ 节点规格:dwsx2.xlarge(选择最小规格即可)
⑨ 热数据存储 :100G
⑩ 节点数量:3
① 集群名称:my-dws。
② 集群版本:选择8.1.3.x以上版本。
③ 管理员用户:保持默认。
④ 管理员密码:设置密码,需满足界面提示的密码复杂度要求,并记住此密码。
⑤ 数据库端口:保持默认。
⑥ 虚拟私有云:DWS-vpc
⑦ 子网:subnet-DWS
⑧ 安全组:自动创建安全组
⑨ 公网访问:现在购买
⑩ 宽带:1Mbit/s
高级配置选择“默认配置”,单击“立即创建”。核对无误,单击“提交”。【创建DWS需要等待10分钟,此时可以继续操作以下步骤】。
鼠标移动到云桌面浏览器页面中左侧菜单栏,点击服务列表->“大数据”->“数据仓库服务GaussDB(DWS)”,进入左侧栏“数据仓库服务”页面,左侧导航选择“连接管理”,选择gsql命令行客户端的OS版本:Redhat x86_64,单击“下载”。
打开Xfce终端终端,gsql客户端默认下载目录为/home/user/Downloads/dws_client_8.1.x_redhat_x64.zip,
将/home/user/Downloads/dws_client_8.1.x_redhat_x64.zip拷贝到/home/user/Desktop/目录下
user@sandbox:~$ cp -a /home/user/Downloads/dws_client_8.1.x_redhat_x64.zip /home/user/Desktop/
user@sandbox:~$ ls /home/user/Desktop/
dws_client_8.1.x_redhat_x64.zip Google Chrome.desktop xfce4-terminal.desktop
user@sandbox:~$
进入DWS的管理控制台界面,查看DWS集群详细信息,查看并复制公网IP地址。
双击“Xfce终端”,进入Terminal命令行窗口,执行以下命令进入/home/user/Desktop/目录。
解压客户端,并执行环境变量。
unzip dws_client_8.1.x_redhat_x64.zip
source gsql_env.sh
通过以下命令连接DWS数据库
gsql -d gaussdb -h <DWS???IP> -U dbadmin -p 8000 -r -W <??dbadmin??>;
gsql -h 114.116.235.158 -d gaussdb -U dbadmin -p 8000 -r -W <设置的dbadmin的密码>
注:前面为AK,后面为SK
在Xfce终端命令行界面,连接DWS,创建表1-REGION。
CREATE TABLE REGION
(
R_REGIONKEY INT NOT NULL,
R_NAME CHAR(25) NOT NULL,
R_COMMENT VARCHAR(152)
)
with (orientation = column)
DISTRIBUTE BY REPLICATION;
复制以下SQL语句,在Terminal命令行窗口中执行,创建表2-NATION。
CREATE TABLE NATION
(
N_NATIONKEY INT NOT NULL,
N_NAME CHAR(25) NOT NULL,
N_REGIONKEY INT NOT NULL,
N_COMMENT VARCHAR(152)
)
with (orientation = column)
DISTRIBUTE BY REPLICATION;
复制以下SQL语句,在Terminal命令行窗口中执行,创建表3- SUPPLIER。
CREATE TABLE SUPPLIER
(
S_SUPPKEY BIGINT NOT NULL ,
S_NAME CHAR(25) NOT NULL ,
S_ADDRESS VARCHAR(40) NOT NULL ,
S_NATIONKEY INT NOT NULL ,
S_PHONE CHAR(15) NOT NULL ,
S_ACCTBAL DECIMAL(15,2) NOT NULL ,
S_COMMENT VARCHAR(101) NOT NULL
)
with (orientation = column)
distribute by hash(S_SUPPKEY)
PARTITION BY RANGE(S_NATIONKEY)
(
PARTITION S_NATIONKEY_1 VALUES LESS THAN(1),
PARTITION S_NATIONKEY_2 VALUES LESS THAN(2),
PARTITION S_NATIONKEY_3 VALUES LESS THAN(3),
PARTITION S_NATIONKEY_4 VALUES LESS THAN(4),
PARTITION S_NATIONKEY_5 VALUES LESS THAN(5),
PARTITION S_NATIONKEY_6 VALUES LESS THAN(6),
PARTITION S_NATIONKEY_7 VALUES LESS THAN(7),
PARTITION S_NATIONKEY_8 VALUES LESS THAN(8),
PARTITION S_NATIONKEY_9 VALUES LESS THAN(9),
PARTITION S_NATIONKEY_10 VALUES LESS THAN(10),
PARTITION S_NATIONKEY_11 VALUES LESS THAN(11),
PARTITION S_NATIONKEY_12 VALUES LESS THAN(12),
PARTITION S_NATIONKEY_13 VALUES LESS THAN(13),
PARTITION S_NATIONKEY_14 VALUES LESS THAN(14),
PARTITION S_NATIONKEY_15 VALUES LESS THAN(15),
PARTITION S_NATIONKEY_16 VALUES LESS THAN(16),
PARTITION S_NATIONKEY_17 VALUES LESS THAN(17),
PARTITION S_NATIONKEY_18 VALUES LESS THAN(18),
PARTITION S_NATIONKEY_19 VALUES LESS THAN(19),
PARTITION S_NATIONKEY_20 VALUES LESS THAN(20),
PARTITION S_NATIONKEY_21 VALUES LESS THAN(21),
PARTITION S_NATIONKEY_22 VALUES LESS THAN(22),
PARTITION S_NATIONKEY_23 VALUES LESS THAN(23),
PARTITION S_NATIONKEY_24 VALUES LESS THAN(24),
PARTITION S_NATIONKEY_25 VALUES LESS THAN(25)
);
复制以下SQL语句,在Terminal命令行窗口中执行,创建表4- CUSTOMER。
CREATE TABLE CUSTOMER
(
C_CUSTKEY BIGINT NOT NULL ,
C_NAME VARCHAR(25) NOT NULL ,
C_ADDRESS VARCHAR(40) NOT NULL ,
C_NATIONKEY INT NOT NULL ,
C_PHONE CHAR(15) NOT NULL ,
C_ACCTBAL DECIMAL(15,2) NOT NULL ,
C_MKTSEGMENT CHAR(10) NOT NULL ,
C_COMMENT VARCHAR(117) NOT NULL
)
with (orientation = column)
distribute by hash(C_CUSTKEY)
PARTITION BY RANGE(C_NATIONKEY)
(
PARTITION C_NATIONKEY_1 VALUES LESS THAN(1),
PARTITION C_NATIONKEY_2 VALUES LESS THAN(2),
PARTITION C_NATIONKEY_3 VALUES LESS THAN(3),
PARTITION C_NATIONKEY_4 VALUES LESS THAN(4),
PARTITION C_NATIONKEY_5 VALUES LESS THAN(5),
PARTITION C_NATIONKEY_6 VALUES LESS THAN(6),
PARTITION C_NATIONKEY_7 VALUES LESS THAN(7),
PARTITION C_NATIONKEY_8 VALUES LESS THAN(8),
PARTITION C_NATIONKEY_9 VALUES LESS THAN(9),
PARTITION C_NATIONKEY_10 VALUES LESS THAN(10),
PARTITION C_NATIONKEY_11 VALUES LESS THAN(11),
PARTITION C_NATIONKEY_12 VALUES LESS THAN(12),
PARTITION C_NATIONKEY_13 VALUES LESS THAN(13),
PARTITION C_NATIONKEY_14 VALUES LESS THAN(14),
PARTITION C_NATIONKEY_15 VALUES LESS THAN(15),
PARTITION C_NATIONKEY_16 VALUES LESS THAN(16),
PARTITION C_NATIONKEY_17 VALUES LESS THAN(17),
PARTITION C_NATIONKEY_18 VALUES LESS THAN(18),
PARTITION C_NATIONKEY_19 VALUES LESS THAN(19),
PARTITION C_NATIONKEY_20 VALUES LESS THAN(20),
PARTITION C_NATIONKEY_21 VALUES LESS THAN(21),
PARTITION C_NATIONKEY_22 VALUES LESS THAN(22),
PARTITION C_NATIONKEY_23 VALUES LESS THAN(23),
PARTITION C_NATIONKEY_24 VALUES LESS THAN(24),
PARTITION C_NATIONKEY_25 VALUES LESS THAN(25)
);
复制以下SQL语句,在Terminal命令行窗口中执行,创建表5- PART。
CREATE TABLE PART
(
P_PARTKEY BIGINT NOT NULL ,
P_NAME VARCHAR(55) NOT NULL ,
P_MFGR CHAR(25) NOT NULL ,
P_BRAND CHAR(10) NOT NULL ,
P_TYPE VARCHAR(25) NOT NULL ,
P_SIZE BIGINT NOT NULL ,
P_CONTAINER CHAR(10) NOT NULL ,
P_RETAILPRICE DECIMAL(15,2) NOT NULL ,
P_COMMENT VARCHAR(23) NOT NULL)
with (orientation = column)
distribute by hash(P_PARTKEY)
PARTITION BY RANGE(P_SIZE)
(
PARTITION P_SIZE_1 VALUES LESS THAN(11),
PARTITION P_SIZE_2 VALUES LESS THAN(21),
PARTITION P_SIZE_3 VALUES LESS THAN(31),
PARTITION P_SIZE_4 VALUES LESS THAN(41),
PARTITION P_SIZE_5 VALUES LESS THAN(51)
);
复制以下SQL语句,在Terminal命令行窗口中执行,创建表6- PARTSUPP。
CREATE TABLE PARTSUPP
(
PS_PARTKEY BIGINT NOT NULL ,
PS_SUPPKEY BIGINT NOT NULL ,
PS_AVAILQTY BIGINT NOT NULL ,
PS_SUPPLYCOST DECIMAL(15,2) NOT NULL ,
PS_COMMENT VARCHAR(199) NOT NULL
)
with (orientation = column)
distribute by hash(PS_PARTKEY)
PARTITION BY RANGE(PS_AVAILQTY)
(
PARTITION PS_AVAILQTY_1 VALUES LESS THAN(1000),
PARTITION PS_AVAILQTY_2 VALUES LESS THAN(2000),
PARTITION PS_AVAILQTY_3 VALUES LESS THAN(3000),
PARTITION PS_AVAILQTY_4 VALUES LESS THAN(4000),
PARTITION PS_AVAILQTY_5 VALUES LESS THAN(5000),
PARTITION PS_AVAILQTY_6 VALUES LESS THAN(6000),
PARTITION PS_AVAILQTY_7 VALUES LESS THAN(7000),
PARTITION PS_AVAILQTY_8 VALUES LESS THAN(8000),
PARTITION PS_AVAILQTY_9 VALUES LESS THAN(9000),
PARTITION PS_AVAILQTY_10 VALUES LESS THAN(10000)
);
复制以下SQL语句,在Terminal命令行窗口中执行,创建表7- ORDERS。
CREATE TABLE ORDERS
(
O_ORDERKEY BIGINT NOT NULL ,
O_CUSTKEY BIGINT NOT NULL ,
O_ORDERSTATUS CHAR(1) NOT NULL ,
O_TOTALPRICE DECIMAL(15,2) NOT NULL ,
O_ORDERDATE DATE NOT NULL ,
O_ORDERPRIORITY CHAR(15) NOT NULL ,
O_CLERK CHAR(15) NOT NULL ,
O_SHIPPRIORITY BIGINT NOT NULL ,
O_COMMENT VARCHAR(79) NOT NULL)
with (orientation = column)
distribute by hash(O_ORDERKEY)
PARTITION BY RANGE(O_ORDERDATE)
(
PARTITION O_ORDERDATE_1 VALUES LESS THAN('1993-01-01 00:00:00'),
PARTITION O_ORDERDATE_2 VALUES LESS THAN('1994-01-01 00:00:00'),
PARTITION O_ORDERDATE_3 VALUES LESS THAN('1995-01-01 00:00:00'),
PARTITION O_ORDERDATE_4 VALUES LESS THAN('1996-01-01 00:00:00'),
PARTITION O_ORDERDATE_5 VALUES LESS THAN('1997-01-01 00:00:00'),
PARTITION O_ORDERDATE_6 VALUES LESS THAN('1998-01-01 00:00:00'),
PARTITION O_ORDERDATE_7 VALUES LESS THAN('1999-01-01 00:00:00')
);
复制以下SQL语句,在Terminal命令行窗口中执行,创建表8- LINEITEM。
CREATE TABLE LINEITEM
(
L_ORDERKEY BIGINT NOT NULL ,
L_PARTKEY BIGINT NOT NULL ,
L_SUPPKEY BIGINT NOT NULL ,
L_LINENUMBER BIGINT NOT NULL ,
L_QUANTITY DECIMAL(15,2) NOT NULL ,
L_EXTENDEDPRICE DECIMAL(15,2) NOT NULL ,
L_DISCOUNT DECIMAL(15,2) NOT NULL ,
L_TAX DECIMAL(15,2) NOT NULL ,
L_RETURNFLAG CHAR(1) NOT NULL ,
L_LINESTATUS CHAR(1) NOT NULL ,
L_SHIPDATE DATE NOT NULL ,
L_COMMITDATE DATE NOT NULL ,
L_RECEIPTDATE DATE NOT NULL ,
L_SHIPINSTRUCT CHAR(25) NOT NULL ,
L_SHIPMODE CHAR(10) NOT NULL ,
L_COMMENT VARCHAR(44) NOT NULL
)
with (orientation = column)
distribute by hash(L_ORDERKEY)
PARTITION BY RANGE(L_SHIPDATE)
(
PARTITION L_SHIPDATE_1 VALUES LESS THAN('1993-01-01 00:00:00'),
PARTITION L_SHIPDATE_2 VALUES LESS THAN('1994-01-01 00:00:00'),
PARTITION L_SHIPDATE_3 VALUES LESS THAN('1995-01-01 00:00:00'),
PARTITION L_SHIPDATE_4 VALUES LESS THAN('1996-01-01 00:00:00'),
PARTITION L_SHIPDATE_5 VALUES LESS THAN('1997-01-01 00:00:00'),
PARTITION L_SHIPDATE_6 VALUES LESS THAN('1998-01-01 00:00:00'),
PARTITION L_SHIPDATE_7 VALUES LESS THAN('1999-01-01 00:00:00')
);
查看表是否创建成功
\d
外表(external table)就像普通的表对像一样,可以select等,只是它是只读的,数据库中只保存了表结构的描述,表数据却没有存放在数据库内,而是存放在了文件系统上。当用户想偶尔使用数据库外的结构化数据时,用起外表来就非常方便。本实验使用的是OBS外表,即外表中包含OBS服务的桶信息、用户凭证AK和SK。
AK和SK值请替换为上述部署获取的值。
CREATE FOREIGN TABLE REGION01
(
like region
)
SERVER gsmpp_server
OPTIONS (
encoding 'utf8',
location 'obs://dws-lab/performance/region.tbl',
format 'text',
delimiter '|',
access_key 'AK值',
secret_access_key 'SK值',
chunksize '64',
IGNORE_EXTRA_DATA 'on'
);
复制以下SQL语句,在Terminal命令行窗口中执行,创建外表2- NATION01。
K和SK值请替换为上述部署获取的值。
CREATE FOREIGN TABLE NATION01
(
like nation
)
SERVER gsmpp_server
OPTIONS (
encoding 'utf8',
location 'obs://dws-lab/performance/nation.tbl',
format 'text',
delimiter '|',
access_key 'AK值',
secret_access_key 'SK值',
chunksize '64',
IGNORE_EXTRA_DATA 'on'
);
复制以下SQL语句,在Terminal命令行窗口中执行,创建外表3- SUPPLIER01。
CREATE FOREIGN TABLE SUPPLIER01
(
like supplier
)
SERVER gsmpp_server
OPTIONS (
encoding 'utf8',
location 'obs://dws-lab/performance/supplier.tbl',
format 'text',
delimiter '|',
access_key 'AK值',
secret_access_key 'SK值',
chunksize '64',
IGNORE_EXTRA_DATA 'on'
);
复制以下SQL语句,在Terminal命令行窗口中执行,创建外表4- CUSTOMER01。
CREATE FOREIGN TABLE CUSTOMER01
(
like customer
)
SERVER gsmpp_server
OPTIONS (
encoding 'utf8',
location 'obs://dws-lab/performance/customer.tbl',
format 'text',
delimiter '|',
access_key 'AK值',
secret_access_key 'SK值',
chunksize '64',
IGNORE_EXTRA_DATA 'on'
);
复制以下SQL语句,在Terminal命令行窗口中执行,创建外表5- PART01。
CREATE FOREIGN TABLE PART01
(
like part
)
SERVER gsmpp_server
OPTIONS (
encoding 'utf8',
location 'obs://dws-lab/performance/part.tbl',
format 'text',
delimiter '|',
access_key 'AK值',
secret_access_key 'SK值',
chunksize '64',
IGNORE_EXTRA_DATA 'on'
);
复制以下SQL语句,在Terminal命令行窗口中执行,创建外表6- PARTSUPP01。
CREATE FOREIGN TABLE PARTSUPP01
(
like partsupp
)
SERVER gsmpp_server
OPTIONS (
encoding 'utf8',
location 'obs://dws-lab/performance/partsupp.tbl',
format 'text',
delimiter '|',
access_key 'AK值',
secret_access_key 'SK值',
chunksize '64',
IGNORE_EXTRA_DATA 'on'
);
复制以下SQL语句,在Terminal命令行窗口中执行,创建外表7- ORDERS01。
CREATE FOREIGN TABLE ORDERS01
(
like orders
)
SERVER gsmpp_server
OPTIONS (
encoding 'utf8',
location 'obs://dws-lab/performance/orders.tbl',
format 'text',
delimiter '|',
access_key 'AK值',
secret_access_key 'SK值',
chunksize '64',
IGNORE_EXTRA_DATA 'on'
);
复制以下SQL语句,在Terminal命令行窗口中执行,创建外表8- LINEITEM01。
CREATE FOREIGN TABLE lineitem01
(
like lineitem
)
SERVER gsmpp_server
OPTIONS (
encoding 'utf8',
location 'obs://dws-lab/performance/lineitem.tbl',
format 'text',
delimiter '|',
access_key 'AK值',
secret_access_key 'SK值',
chunksize '64',
IGNORE_EXTRA_DATA 'on'
);
复制以下SQL语句,在Terminal命令行窗口中执行,导入数据,此过程预计5~8分钟,请耐心等待。
insert into region select * from region01;
insert into nation select * from nation01;
insert into supplier select * from supplier01;
insert into customer select * from customer01;
insert into part select * from part01;
insert into partsupp select * from partsupp01;
insert into orders select * from orders01;
insert into lineitem select * from lineitem01;
执行EXPLAIN PERFORMANCE命令,收集DML语句(SELECT/UPDATE/INSERT/DELETE/MERGE INTO/CREATE TABLE AS)详细的执行信息。在性能调优环节中,使用EXPLAIN PERFORMANCE查看执行计划及实际运行情况,以便更精准地定位问题原因。
复制以下SQL语句,在已连接DWS数据库的Terminal命令行窗口中执行,查询执行计划。显示如下图类似结果,表示执行时间为1356毫秒。
EXPLAIN PERFORMANCE
SELECT
count(distinct c_custkey)
FROM customer
WHERE c_custkey IN (
SELECT DISTINCT o_custkey
FROM orders
);
执行以下SQL查询表orders的分布列,返回结果为o_orderkey。
SELECT getdistributekey('public.orders');
由于以上待定位的SQL查询中,WHERE字句是关联了表orders的o_custkey列,可以考虑把表orders的分布列o_orderkey修改为关联列o_custkey,以达到性能加速的目的。执行以下SQL进行分布列修改。
ALTER TABLE orders DISTRIBUTE BY HASH(o_custkey);
再执行以下SQL,查看新的执行计划,发现时间为847毫秒,可见修改分布列为关联列,可以提高性能。
EXPLAIN PERFORMANCE
SELECT
count(distinct c_custkey)
FROM customer
WHERE c_custkey IN (
SELECT DISTINCT o_custkey
FROM orders
);
可以参考官方文档,建立索引性能优化、Join性能优化等方面进行DWS数据仓库性能优化。
查看当前数据库中所有表。
\d
查看所有数据库列表
\l
查看某个表中内容
select * from nation;