|
基于列存储的数据库,相对于传统的基于行的数据库,它更适合在数据仓库存储方面发挥特长。基于列存储的数据库的优点: a)、对于聚集操作,比如求sum,明显基于列存储的要比基于行存储的快; b)、对于update操作,不须接触其他列值; c)、基于行存储的数据库在查询每行记录的多个列值更高效的条件是,row-size比较小,这样一次磁盘读取就可以获取整行; d)、基于行存储的数据库在insert一行的时候相对更高效,毕竟可一次写入一个连续空间,即一次single disk seek。 从实际情况上来看,基于行存储的数据库更适合OLTP(联机事务处理系统),基于列存储的数据库更适合OLAP(联机分析处理系统),比如数据仓库。除此之外,同一列必定是同一类型大小,基于列存储的数据库更容易使用高效的存储方式,与之相对,基于行存储的数据库则只能采用随机方式处理列值了。
Vertica数据库的设计特点是: a)、它是基于列的存储结构,提高了连续的record处理的性能,但是在一般事务中增加了对单独record进行update和delete的开销; b)、“单独”更新(out-of-place updates)和混合存储结构,提高了查询、插入的性能,但增加了update和delete的开销; c)、压缩,减少存储开销和IO带宽开销; d)、完全无共享架构,降低对共享资源的系统竞争。 Vertica数据库运行在基于Linux的网格服务器上,目前应用于Amazon Elastic Compute Cloud的数据库管理系统。
常用命令如下:
一、进入vertica的sql环境:vsql -d dbname -w passwd 在vertica的sql环境下获取帮助 dbname=>\h
二、(1)查询用户:select * from v_catalog.users; (2)查询schema:select * from schemata; 注:vertica中,某个schema必须附属于某个用户(user),查询用户和schema信息: SELECT u.user_name, s.schema_name FROM users u LEFT OUTER JOIN schemata s ON u.user_name = s.schema_owner
三、创建用户和schema: (1)创建一个用户:create user dev_test identified by 'test'; (2)基于某个用户创建schema:create schema if not exists test authorization dev_test; (3)重命名(备份用)dataname数据库为 dataname_bak:alter schema dataname rename to dataname_bak; (4)删除dataname库:drop schema dataname cascade;
三、赋权: (1)一个schema上的权限赋给另一个用户:GRANT USAGE ON SCHEMA dbname_dw TO dev_test; (2)把对某个表的操作的权限赋给另一个用户:GRANT ALL ON TABLE tw_re_pm_cell_all_cell_h to dev_test; (3)从某个用户收回对某个schema的使用权限:revoke all on SCHEMA dbname_dw from dev_test; (4)从某个用户收回对某个表的使用权限:revoke all on table fct_flux_se_flux_flow_whole_ana_d from dev_test;
三、序列: (1)查询系统中的序列:select * from sequences; (2)创建序列: 简单语法:CREATE SEQUENCE sq1 MAXVALUE 5000 START 1; 标准语法:CREATE SEQUENCE [[db-name.]schema.]sequence_name ... [ INCREMENT [ BY ] positive_or_negative ] ... [ MINVALUE minvalue | NO MINVALUE ] ... [ MAXVALUE maxvalue | NO MAXVALUE ] ... [ START [ WITH ] start ] ... [ CACHE cache ] ... [ CYCLE | NO CYCLE ]
(3)1、使用序列:SELECT NEXTVAL('my_seq'); SELECT CURRVAL('my_seq'); 注:一个新创建还没有使用过的序列,必须首先执行NEXTVAL,然后才能执行CURRVAL。 2、在INSERT语句里使用序列:INSERT INTO customer VALUES ('Hawkins' ,'John', 072753, NEXTVAL('my_seq')); 3、在INSERT语句里把序列作为默认值: CREATE TABLE eND (3.1067, 2.0), '999999999999999999.00'))
-- 产生随机数 1、RANDOM() RANDOM has no arguments. Its result is a FLOAT8 data type
SELECT RANDOM(); random ------------------- 0.211625560652465 (1 row)
2、RANDOMINT Returns a uniformly-distributed integer I, where 0 <= I < N, where N <= MAX_INT8. That is, RANDOMINT(N) returns one of the N integers from 0 through N-1.
RANDOMINT ( N )
Example: In the following example, the result is an INT8, which is >= 0 and < N. In this case, INT8 is randomly chosen from the set {0,1,2,3,4}. SELECT RANDOMINT(5); randomint ---------- 3 (1 row) |