转---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 约束, ...... ) 修改表名 ...
随机推荐
- MS-DOS 系统汇编环境之DOSBOX+vim
经过虚拟机的体验,我发现还是dosbox里汇编比较方便..... 一.下载安装 dosbox DOSBOX 准备好 masm.exe.link.exe.debug.exe,放在~/dos下(文件夹名字 ...
- Configure new Nagios clients
安装rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpmrpm -Uvh http:// ...
- 【BZOJ2137】submultiple(数论)
[BZOJ2137]submultiple(数论) 题面 BZOJ 题解 首先不难发现答案就是:\(\displaystyle\prod_{i=1}^n (\sum_{j=1}^{p_i+1}j^k) ...
- 【转】STM32三种启动模式
@2018-12-16 [小记] STM32 启动区域 STM32三种启动模式 借助上述文章理解官方文档<一种从用户代码调用系统存储器中 Bootloader 的方法 >
- 每天一个Linux命令(03):du命令
du命令 今天找开发定位问题,看到他使用了这个命令,查看文件,之前知道df,所以今天的每天系列把这命令 du命令也是查看使用空间的,但是与df命令不同的是Linux du命令是对文件和目录磁盘使用的空 ...
- Apache rewrite地址重写
Apache-rewrite+13个经典案例Apache 重写规则的常见应用(rewrite)一:目的 如何用Apache重写规则来解决一些常见的URL重写方法的问题,通过常见的 实例给用户一些使用重 ...
- HDU6341 Let Sudoku Rotate (杭电多校4J)
给一个由4*4个4*4的小格组成数独,这些数独是由一个块逆时针旋转得来的,所以要还原的话就模拟出顺时针的过程,先把里面的字母转化成数字,然后从第一个块开始枚举,每个dfs和之前枚举的已经满足条件的块, ...
- [SDOI2010]大陆争霸
幻想历8012年5月12日深夜,斯普林·布拉泽降下神谕:“Trust me, earn eternal life.”克里斯军团士气大增.作为克里斯军团的主帅,你决定利用这一机会发动奇袭,一举击败杰森国 ...
- MongoDb 命令查询所有数据库列表
原文:http://blog.csdn.net/huxu981598436/article/details/47216493 MongoDb 命令查询所有数据库列表 CODE: > show d ...
- redis 指令文档
参考:https://redis.io/commands http://www.runoob.com/redis/redis-lists.html redis: 打开一个 cmd 窗口 使用cd命令切 ...