Q1:为什么直抽比etl抽取速度慢
背景:在进行演示时,直抽为带文件图标加载,etl为直接加载,同时直抽导入的表为info,etl导入的表为test,二者结构如下:可见test的表字段总长小于info的字段总长,差距在于age字段。
1.直抽时,带文件加载比直接加载要慢,速度差距约在1w左右。直接加载时速度在7.4w条/s
文件加载时的抽取速度
查看文件图标的含义,复制输出副本所以加载速度变慢。
2.修改etl的加载表字段总长与直抽总长一致,对导入速度进行对比
短字段总长速度更快,为9.6w/s
长字段时速度减慢,为8.8w/s,可见表结构对导入数据有不小的影响。
- 修改了此两项,直抽的速度仍然比etl较低一些(近1w/s),个人猜测为:对于一个字段其长度为n与多个字段其长度和为n,后者的加载速度更快。但此项不太具备可比性,仅从测试结果提出猜想。
Q2:Vertica是否支持触发器
- 类比mysql语法 在命令行创建触发器需要先定义分隔符,但是Vertica中无法建立对应的分隔符。Vertica中使用mysql的创建触发器语法报错
- 在vertica7.2.1和9.0.1的官方文档中查阅,均未有对于触发器的介绍。
- 通过谷歌镜像查找资料,社区中对此项给出了证实,触发器在vertica7中已经是空接口,在内部环境进行操作时,trigger与trigger的操作函数(下图显示例为load_triggers())均无法使用tab键自动补全。
-
综上可认为vertica不支持触发器操作。
-
Q3:Vertica的特点总结
Vertica的特点
1.分布式列存储 高可用 k级安全性
2.分布式查询执行,查询优化选择器选择最优的查询规划
3.利用explain进行对应的查看,vertica自己会选择一个最优的查询规划
Vertica速度快的原因:
1.列式存储降低了磁盘的IO
2.存储时会进行简单排序,存储为查询做了一定的优化设计
3.强大的数据主动压缩
根据数据类型、基数、排序自动进行数据压缩,支持12+的压缩算法
压缩比通常可达10:1以上
支持直接访问编码数据的数据值,节省了在数据查询期间的CPU开销
4.混合型数据存储
ROS:(读优化存储)磁盘式、优化数据存储(已排序、已压缩、已分段)。做到了大量数据的直接加载
WOS:(写优化存储)面向低延时数据载入的内存式数据存储
5.自动性能调节,手动性能调节:dba自身进行对DataBase Designer进行设计。
Vertica的工作方式:
客户节点连接并发出查询指令:
客户连接的节点称为起始节点,连接节点与其他节点一起称为执行节点
起始节点对查询进行分析并选择一项执行规划
起始节点将查询规划分配至执行节点
所有节点均在当地执行查询规划
执行节点将部分查询结果返回到起始节点
起始节点将所有节点的结果进行汇总
起始节点将最终结果返回给用户
Vertica事务处理的隔离级别
- 默认是读操作提交(Read Committed)
-
可以进行多线程写入与边读边写。
轻量级锁定:数据选择不需要锁定。
同时进行加载和查询,无锁定争议。
Q4:Vertica的锁机制
Vertica 数据库锁
在多个用户并发访问相同数据库信息的环境中, 数据处理可能会导致冲突并破
坏数据完整性。
发生这些冲突的原因是, 某些事务会在事务完成前阻止其他操作。由于同时提
交的事务应产生一致的结果, 因此, Vertica 使用各种锁来维持数据并发性和一
致性。Vertica 会根据对象状态, 通过限制用户可对该对象执行的操作来控制锁
定情况。
Vertica 使用对象锁和系统锁。对象锁用于对象, 如表和投影。系统锁包括全局
编录锁、本地编录锁和弹性群集锁。
锁定模式
Vertica 具有不同的锁定模式, 这些锁定模式决定了锁在对象上如何发挥作用。
每个锁定模式都具有一种锁定兼容性和锁定强度, 反映了它在同一个环境中如
何与其他锁交互。
-
实例:6w+insert脚本死锁问题
加了I级锁(insert锁)之后要做drop/truncate操作,即在I级锁的基础上再加O级锁,遇到死锁问题。
简单的方法为:selECT close_all_sessions();关闭造成死锁的session。
考虑到在实际使用中,撤销所有锁会导致任务丢失,必须小心的撤销导致的死锁session 。具体操作方法如下:
dbadmin=> selECT a.session_id
dbadmin-> from v_monitor.sessions a,v_monitor.locks b
dbadmin-> where a.transaction_id = b.transaction_id;
dbadmin=> selECT close_session('v_mydb_node0001-46463:0x2b2ab');
close_session
--------------------------------------------------------------------
Session close command sent. Check v_monitor.sessions for progress.
(1 row)
至于脚本为什么会导致死锁(I锁未及时释放),还有待研究,