Vertica疑问整理

Q1:为什么直抽比etl抽取速度慢

背景:在进行演示时,直抽为带文件图标加载,etl为直接加载,同时直抽导入的表为info,etl导入的表为test,二者结构如下:可见test的表字段总长小于info的字段总长,差距在于age字段。

1.直抽时,带文件加载比直接加载要慢,速度差距约在1w左右。直接加载时速度在7.4w条/s

文件加载时的抽取速度

查看文件图标的含义,复制输出副本所以加载速度变慢。

2.修改etl的加载表字段总长与直抽总长一致,对导入速度进行对比

短字段总长速度更快,为9.6w/s

长字段时速度减慢,为8.8w/s,可见表结构对导入数据有不小的影响。

  1. 修改了此两项,直抽的速度仍然比etl较低一些(近1w/s),个人猜测为:对于一个字段其长度为n与多个字段其长度和为n,后者的加载速度更快。但此项不太具备可比性,仅从测试结果提出猜想。

Q2:Vertica是否支持触发器

  1. 类比mysql语法 在命令行创建触发器需要先定义分隔符,但是Vertica中无法建立对应的分隔符。Vertica中使用mysql的创建触发器语法报错
  2. 在vertica7.2.1和9.0.1的官方文档中查阅,均未有对于触发器的介绍。
  3. 通过谷歌镜像查找资料,社区中对此项给出了证实,触发器在vertica7中已经是空接口,在内部环境进行操作时,trigger与trigger的操作函数(下图显示例为load_triggers())均无法使用tab键自动补全。
  4. 综上可认为vertica不支持触发器操作。

  5. 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事务处理的隔离级别

  6. 默认是读操作提交(Read Committed)
  7. 可以进行多线程写入与边读边写。

    轻量级锁定:数据选择不需要锁定。

    同时进行加载和查询,无锁定争议。

    Q4:Vertica的锁机制

    Vertica 数据库锁

    在多个用户并发访问相同数据库信息的环境中, 数据处理可能会导致冲突并破

    坏数据完整性。

    发生这些冲突的原因是, 某些事务会在事务完成前阻止其他操作。由于同时提

    交的事务应产生一致的结果, 因此, Vertica 使用各种锁来维持数据并发性和一

    致性。Vertica 会根据对象状态, 通过限制用户可对该对象执行的操作来控制锁

    定情况。

    Vertica 使用对象锁和系统锁。对象锁用于对象, 如表和投影。系统锁包括全局

    编录锁、本地编录锁和弹性群集锁。

    锁定模式

    Vertica 具有不同的锁定模式, 这些锁定模式决定了锁在对象上如何发挥作用。

    每个锁定模式都具有一种锁定兼容性和锁定强度, 反映了它在同一个环境中如

    何与其他锁交互。

  8. 实例: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锁未及时释放),还有待研究,

猜你喜欢

转载自blog.csdn.net/weixin_42348333/article/details/81750397
今日推荐