• 转---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 '	' 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';
    
    
    如果有来生,一个人去远行,看不同的风景,感受生命的活力。。。
  • 相关阅读:
    济南学习 Day5 T3 晚
    Codevs 1043 ==洛谷 P1004 方格取数
    济南学习 Day 5 T2 晚
    济南学习 Day 5 T1 晚
    济南学习 Day 5 T3 am
    济南学习 Day 5 T2 am
    LeetCode Weekly Contest 8
    poj-1410 Intersection
    leetcode-Warm Up Contest-Aug.21
    poj-1384 Piggy-Bank
  • 原文地址:https://www.cnblogs.com/Frank99/p/9543448.html
Copyright © 2020-2023  润新知