传统数据库的数据是存在表里的,
和传统数据库不同,Vertica物理上将表数据存在Projections中,Projection实际上是表的列的集合。
和物化视图类似,projections将结果集进行存储在disk上,而不是每次查询时再进行计算。
当有新数据或数据更新时,Vertica会自动刷新这些结果集。
Projections有如下好处 :
- 将数据进行压缩和编码,减少存储空间需求。直接对编码数据进行操作,降低解码的消耗。
- 方便集群间的分布。基于其大小,projections可以被segmented(大表场景)或者replicated(其他)。
- 对终端用户透明。Vertica查询优化器再执行给定查询时,自动选择最好的projection
- 提供高可用性、可恢复性。集群中,Vertica至少会将表的列复制K+1份。
Projection Types
一个Vertica的表通常有许多projections,每个包含了不同的内容。
给定一张表的不同projection的内容之间,再范围和组织形式上可能不同。
- Superprojections
对于数据库中的每张表,Vertica需要至少有一个superprojection,这个superprojection包含了该表的所有列。
在没有query-specific projection的情况下,Vertica使用Superprojection来进行相关操作。支持任何查询和DML。
在某些条件下,Vertica会在创建表时自动创建表的superprojection。
如果没有projection存在,当第一次加载数据到表中时,Vertica也会自动创建superprojection。
也可以使用CREATE PROJECTION语句来进行创建。
一个表可以包含多个superprojection。
Superprojection可以支持表的所有查询,因此它对于特定的查询来说,不是最优的。
- Query-specific projections
只包含表列的子集的projection,用于执行给定的查询。会显著的提高这些给定查询的性能。
- Aggregate projections
如果一个projection包含表达式、聚合函数的结果数据,那么对于含表达式、聚合函数的查询来说,这是最优的。这种projection被称之为Aggregate projection。
Aggregate又分为三类:
- projection that containes expressions
- live aggregate projection
- Top-K projection
Projection segmentation
- Segmented Projections
对于大表来说,通常需要创建segmented projections。Vertica将segmented projections切分为更小大小的segments,并将这些segments平均分布在集群节点上。
K-safety定义了每个segment有多少副本。
projection segmentation可以达到如下目标:
- 实现高可用、可恢复性
- 使用多个节点来加速查询
- 使不同的节点可以为不同的查询负载单独优化
- Hash segmentation
Vertica使用hash算法将大的projection进行segment。
- Unsegmented projections
多数情况下,对于十分小尺寸的表,无需进行segment。
Designing projections
Vertica建议使用Database Designer来设计physcal schema,
Projection Definition Components
创建projection
=> CREATE PROJECTION retail_sales_fact_p ( store_key ENCODING RLE, pos_transaction_number ENCODING RLE, sales_dollar_amount, cost_dollar_amount ) AS SELECT store_key, pos_transaction_number, sales_dollar_amount, cost_dollar_amount FROM store.store_sales_fact ORDER BY store_key SEGMENTED BY HASH(pos_transaction_number) ALL NODES;
包含如下四个元素:
- 列、及其编码
- 基本查询
- 排序顺序
- segmentation
定义如何将projection分布到数据库的节点上。