基础知识
vertica的分区方法与目的与其他数据库没有区别,都是为了更高效的对数据进行管理。
vertica中有一个活动分区的概念,特指最新创建的那个分区。非活动分区包含可能不需要经常访问的数据。在执行合并时,对于非活动分区,Tuple Mover将所有ROS容器组合到一个ROS容器中。在活动分区中,Tuple Mover使用基于分层的算法来组合ROS容器。(一个ROS(读取优化存储器)容器是一组存储在文件中的一组特定的行。ROS容器是通过Moveout或COPY DIRECT等操作创建的。您可以查询STORAGE_CONTAINERS系统表以查看ROS 容器。由于数据差异,ROS容器布局在各个节点上可能会有所不同。分段可以向一个节点传递比另一节点更多的行。两个数据负载可能适合一个节点上的WOS,而溢出到另一个节点上。)数据分区被定义为表属性,并在该表的所有投影上实现。在所有加载,刷新和恢复操作中,Vertica Tuple Mover会自动将数据分区到单独的ROS容器中。每个ROS容器包含一个分区或分区组的数据 ; 根据空间要求,一个分区或分区组可以跨越多个ROS容器。
可以通过更改ActivePartitionCount配置参数来更改每个表的活动分区数,默认值为1。
如果经常将数据加载到最后两个分区,请将ActivePartitionCount更改为2。这是一个全局配置参数,会影响每个表。如果将其设置为2,则Tuple Mover将分层算法应用于最后两个创建的分区。
增加ActivePartitionCount可减少Tuple Mover操作的数量。但是,您的投影中可能会有太多的ROS容器。
Vertica建议您仅分区大型事实表,不要对小表或维度表进行分区,这样做会创建大量的ROS容器,这会快速增加目录大小并影响查询性能。
为表定义分区表达式时,请考虑以下事项:
- 数据保留政策
- 经常使用的查询谓词
- 分区粒度可能对每个节点的每个投影的ROS容器数量和每个节点的ROS文件总数产生的影响
分区和存储修剪
分区如何影响数据生命周期管理?
在Vertica数据库中对大型事实表进行分区可以简化数据生命周期管理并提高查询性能。
Vertica提供以下功能:
- 从表中删除分区。(DROP_PARTITION函数)
- 将很少使用的分区移动到存档表。(MOVE_PARTITIONS_TO_TABLE函数)
- 将很少使用的分区移动到较便宜的存储。
- 从存档还原分区。
vertica的一些分区函数可以参考:
https://www.vertica.com/docs/9.2.x/HTML/Content/Authoring/SQLReferenceManual/Functions/VerticaFunctions/PartitionManagement/PartitionManagementFunctions.htm?tocpath=SQL Reference Manual|SQL Functions|Vertica Meta-Functions|Partition Management Functions|_____0
vertica的存储策略可以参考:
https://www.vertica.com/docs/9.2.x/HTML/Content/Authoring/AdministratorsGuide/StorageLocations/CreatingStoragePolicies.htm
什么是存储修剪以及它与分区有什么关系?
分区数据被分隔到各个存储容器中。因此,在分区列上使用谓词的查询可以从Vertica存储修剪功能中获益。
在查询规划阶段,数据库优化器会识别不包含该查询所需数据的存储容器。在查询处理期间,Vertica执行引擎省略了不存储适用值的存储容器,从而减少了I / O并提高了查询性能。
如何判断我的查询是否利用了分区和存储修剪?
1.配置查询以获取transaction_id和statement_id
SELECT * FROM <table_name> WHERE <column_name> BETWEEN 5 AND 7;
NOTICE 4788: Statement is being profiled
HINT: Select