转---redshift database ---学习
前沿
根据最近一段时间对redshift的研究,发现一些特性比较适合我们当前的业务.
1 比如它的快速恢复能力,因为这一点,我们可以尽量在redshit里面存放一定生命周期的数据,对过期的数据可以做镜像备份,真的需要再从镜像中进行恢复也是非常快的,而且恢复是一键式的,这样我们保持一个较小的高性能的redshit集群就能满足当前的需求,从成本上节约.
2 另外它也很容易扩展,可以从一个小集群扩展到多个服务器的集群,这个根据我们业务的发展来定.
一、 测试服redshit 连接方式:
方式一
yum install postgresql-server 安装客户端
psql -h voga-dw-instance.cif5fe4nnyim.ap-southeast-1.redshift.amazonaws.com -Ustat_user -d statdb -p 5439
stat_user2013MOBO_STAT
方式二
利用workbench客户端连接(推荐)
链接: http://pan.baidu.com/s/1c0y38eW 密码: hty5
二、redshift的一些限制
1、redshif 最大限制9900个表。
2、redshif 支持的数据类型
支持的数据类型:
不支持的数据类型
• Arrays
• BIT, BIT VARYING
• BYTEA
• Composite Types
• Date/Time Types
• INTERVAL
• TIME
• TIMESTAMP WITH TIMEZONE
• Enumerated Types
• Geometric Types
• JSON
• Network Address Types
• Numeric Types
• SERIAL, BIGSERIAL, SMALLSERIAL
• MONEY
• Object Identifier Types
• Pseudo-Types
• Range Types
• Text Search Types
• TXID_SNAPSHOT
• UUID
• XML
3、redshift 不支持的 postgresql functions
Unsupported PostgreSQL functions
三、字段名和表名 是否区分大小写?
结论
1、字段 tablename可以全部大写,也可以部分大写:
2、表名称 pg_table_def 可以大写也可以小写。
3、但是当表名作为条件时,严格大小写。
四 、 查询效率初步测试:
测试表数据量600w
五、导入效率:
导入: 导入 600w行 用时16.61秒,导入性能堪比infobrght
导入1亿+ 用时21m52s 导入失败的是数据不规范的行
导入时对原来服务器的性能消耗:CPU 10%,内存基本上消耗很少
表结构:
六、表设计最佳实践
• Choosing the best sort key #选择最佳排序字段key
• Choosing the best distribution key #选择最佳的分区key
• Defining primary key and foreign key constraints #定义主键和外键的约束
• Using the smallest possible column size #列的大小尽量最小化,够用即可,不要太大方了。
• Using date/time data types for date columns # 使用date 或者 time 作为时间数据类型
• Specifying redundant predicates on the sort column #在排序列使用冗余
(1) 选择排序key
实例:
1、如果查询最多的数据是最近的,那么使用时间字段作为排序列,是一个非常不错的选择。
2、如果经常在某个字段做过滤,那么选择这个字段作为 sort key 。原因是 redshitf记录每一个块的最大值和最小值,这样就很容易确认这个块中有没有查询需要的数据,由此可以跳过很多不需要查询的块,从而节省时间。
3、如果这个字段经常用来做join 那么就把这个字段设置为 sort key 和 distribution key。
这样就能利用 排序合并(merge join)取代较慢的 hash join。
(2) 选择分区key
distribution key 决定了数据在计算节点的数据分布。
好的数据分区建应该满足
1、数据均匀的分布在 不同的节点和分片中。????
To distribute data evenly among the nodes and slices in a cluster.
Uneven distribution, or data distribution skew, forces some nodes to do more work than others, slowing
the whole process down.
2、为数据的聚合和join做准备
当参加聚合操作的数据在不同的节点上时,更多的数据需要移动。
When rows that participate in joins or aggregations are located on different nodes, more data has to
moved among nodes.
最佳实践
1、如果你经常需要某一列作join,那么就选这一列做分区索引。
2、如果这个字段经常做等值过滤,就不要选做 分区索引。
3、如果这个表的数据很大,不规范,并且不会有join操作,那就不要选 分区索引,它会自己分配到各个节点中去的。
(3)Defining primary key and foreign key constraints
尽量要定义主键和外键约束
(4)Using the smallest possible column size
提升查询效率,依赖于你的列的大小。
(5)Using date/time data
redshit 查询和存储 时间类型的性能,比 varchar类型 char类型要好。
(6) 尽量多的过滤条件
SQL1
SELECT * FROM tab1, tab2
WHERE tab1.key = tab2.key
AND tab1.timestamp > '1/1/2013';
SQL2
SELECT * FROM tab1, tab2
WHERE tab1.key = tab2.key
AND tab1.timestamp > '1/1/2013'
AND tab2.timestamp > '1/1/2013';
SQL2的效率要比SQL1的高
七、常用SQL参考
7.1 redshift 建表样例
CREATE TABLE T_LOGSECOND_ANDROID_COUNTRY_SOURCE (
COUNTRY varchar(8) NOT NULL DEFAULT '' ,
SOURCE varchar(20) NOT NULL DEFAULT '' ,
TYPE_NUM integer NOT NULL DEFAULT '0' ,
STAT_TYPE integer NOT NULL DEFAULT '0' ,
STAT_TIME date NOT NULL DEFAULT '2014-01-01' sortkey
);
可以像mysql一样建表,但是没有comment 字段描述的内容,这可能对表的维护上造成一些麻烦。
eg:
ERROR: syntax error at or near "COMMENT"
LINE 2: COUNTRY varchar(8) NOT NULL DEFAULT '' COMMENT 'IP所属国家...'
-- 创建表
create table ngix_log_test_2(like ngix_log_test);
select * from ngix_log_test_2 limit 10;
-- 创建表并插入数据
create table event_2(like event);
insert into event_2 select * from event;
7.2 从S3上导入数据
-- 导入数据
copy sales from 's3://awssampledbapsoutheast1/tickit/sales_tab.txt'
CREDENTIALS 'aws_access_key_id=xx;aws_secret_access_key=xx'
delimiter '\t' timeformat 'MM/DD/YYYY HH:MI:SS';
INFO: Load into table 'sales' completed, 3766 record(s) loaded successfully.
也可以从各个服务器上导入数据。
参考附件:
7.3从redshit导出数据
-- 导出数据
unload ('select * from venue')
to 's3://dbbk.voga360.com/zhangwen/venue/'
CREDENTIALS 'aws_access_key_id=xx;aws_secret_access_key=xx';
7.4 参考查询语句
-- Find top 10 buyers by quantity.
SELECT firstname, lastname, total_quantity
FROM (SELECT buyerid, sum(qtysold) total_quantity
FROM sales
GROUP BY buyerid
ORDER BY total_quantity desc limit 10) Q, users
WHERE Q.buyerid = userid
ORDER BY Q.total_quantity desc;
-- 查询结果样例
firstname | lastname | total_quantity
-----------+-----------+----------------
Slade | Hatfield | 20
Blaine | Anderson | 17
Lars | Nichols | 16
Quinlan | Underwood | 16
Oleg | Spencer | 16
Violet | Delaney | 16
Brian | Bowen | 16
Barrett | Collins | 16
Nissim | Mueller | 14
Carl | Morrison | 14
(10 rows)
-- Find events in the 99.9 percentile in terms of all time gross sales.
SELECT eventname, total_price
FROM (SELECT eventid, total_price, ntile(1000) over(order by total_pricedesc) as percentile
FROM (SELECT eventid, sum(pricepaid) total_price
FROM sales
GROUP BY eventid)) Q, event E
WHERE Q.eventid = E.eventid
AND percentile = 1
ORDER BY total_price desc;
eventname | total_price
----------------+-------------
Les Miserables | 4161.00
Jill Scott | 3687.00
(2 rows)
7.5 创建用户及用户权限管理
select * from pg_user;
create user danny with password 'abcD1234';
create user danny with password 'abcD1234' valid until '2014-06-10'; #添加用户的有效期
drop user danny, billybob;
grant select on table sales to bobr;
grant all on schema qa_tickit to group qa_users;
7.6 查看表的属性 及定义
select "column", type, encoding, distkey, sortkey
from pg_table_def where tablename = 'myevent';
转---redshift database ---学习的更多相关文章
- SQL Database学习笔记
1. linux下快速安装MariaDB: MariaDB 是 一个采用 Maria 存储引擎的 MySQL 分支版本,是由原来 MySQL 的作者 Michael Widenius 创办的公司所 ...
- Database学习 - mysql 连接数据库 库操作
连接数据库 语法格式: mysql -h 服务器IP -P 端口号 -u用户名 -p密码 --prompt 命令提示符 --delimiter 指定分隔符 示例: mysql -h 127.0.0.1 ...
- Database学习 - mysql 视图/触发器/函数
- Database学习 - mysql 数据库 事务操作
事务 事务指逻辑上的一组操作,组成这组操作的各个单元,要不全部成功,要不全部不成功. 数据库开启事务命令: start transaction 开启事务 rollback 回滚事务,即撤销指定的 ...
- Database学习 - mysql 数据库 索引
索引 索引在mysql 中也叫 '键',是存储引擎用来快速找到记录的一种数据结构.索引对于良好的性能非常关键,尤其是当表中的数据量越来越大时,索引对于性能的影响愈发重要. 索引优化应该是对查询性能优化 ...
- Database学习 - mysql 数据库 多表/复合/子 查询
多表查询 多表查询,基本规则,通过两表有关联字段的进行条件匹配查询 内连接查询 方式一: SELECT 查看字段名[,查看字段名] FROM 一表名,二表名 WHERE 一/二表.字段 = 一/二表. ...
- Database学习 - mysql 数据库 外键
外键 外键约束子表的含义:如果在父表中赵达不到候选键,则不允许在子表上进行insert/update 外键预约对父表的含义:在父表上进行update/delete以更新或删除子表中有一条或多条对应匹配 ...
- Database学习 - mysql 数据库 数据操作
mysql数据操作 查询语法 select * | field1,field1 ... from 表名 where 条件 group by 字段 having 筛选 order by 字段 limit ...
- Database学习 - mysql 数据库 表操作
mysql 数据库 表操作 创建数据表 基本语法格式: 创建数据表: create table 表名( 字段名 datatype 约束, 字段名 datatype 约束, ...... ) 修改表名 ...
随机推荐
- wstngfw IPsec 站点到站点连接示例
wstngfw IPsec 站点到站点连接示例 在本例中,将假设以下设置: IPsec站点设置 站点 A 站点 B 名称 Beijing Office(北京办公室) 名称 Shenzheng Offi ...
- NOIP2018 差点退役记
Day 1 不想说了,反正就是三个水题,直接来讲Day 2. Day 2 一上来,T1做法写的丑了点,折腾了一会,大概50min的样子写完了. T3一眼DDP--这玩意儿我就写过一个模板,还只写过一次 ...
- 自学zabbix集锦
zabbix概念集锦 01 Zabbix采集数据方式 02 开源监控软件Cacti.nagios 03 Zabbix常用的术语 04 Zabbix核心概念回顾 05 Zabbix triggers-- ...
- 用户队列服务API
/// <summary> /// 用户队列服务API /// </summary> public interface ICustomerQueueManager : ISer ...
- ELK部署详解--elasticsearch
#Elasticsearch 是一个实时的分布式搜索和分析引擎,它可以用于全文搜索,结构化搜索以及分析.它是一个建立在全文搜索引擎 Apache Lucene 基础上的搜索引擎,使用 Java 语言编 ...
- wildfly 10上使用最新的 Hibernate ORM OGM
ORM是关系型数据库连接:ogm是No sql数据库连接,Mongo, redis等. 1,下载ogm zip包,解压到wildfly_home\modules\system\layers\base, ...
- css 选择符中的 >,+,~,=,^,$,*,|,:,空格 的意思
一,作为元素选择符 * 表示通配选择符 * {} // 所有元素 二,作为关系选择符 空格 表示包含选择符 a div{} // 被a元素包含的div > 表示子元素选择符 a > div ...
- OpenLayers学习笔记(五)— 拖拽Feature图层
参考文档的例子可以知道如何拖动矢量图层feature GitHub: 八至 作者:狐狸家的鱼 本文链接:拖拽Feature图层 全部代码 <!DOCTYPE html> <html& ...
- 使用ZXing.Net生成与识别二维码(QR Code)
Google ZXing是目前一个常用的基于Java实现的多种格式的1D/2D条码图像处理库,出于其开源的特性其现在已有多平台版本.比如今天要用到的ZXing.Net就是针对微软.Net平台的版本.使 ...
- 【译】6. Java反射——Getter和Setter
原文地址:http://tutorials.jenkov.com/java-reflection/getters-setters.html ============================== ...