数据分布:数据分布是将数据划分为子集, 按一定规则, 均衡地分布在不同节点上,以期最大限度地利用集群的并发性能。
短查询:short-scan query,指扫描数据量不大,单机就能完成扫描的查询。
长查询:long-scan query,指扫描数据量大,多机并行扫描能显著提升性能的查询,OLAP基本属于长查询。
离散系数:离散系数又称变异系数,是统计学当中的常用统计指标。离散系数是测度数据离散程度的相对统计量,其定义为标准差与平均值之比,主要是用于比较不同样本数据的离散程度。离散系数大,说明数据的离散程度也大;离散系数小,说明数据的离散程度也小。
DorisDB使用先分区后分桶的方式, 可灵活地支持支持二种分布方式:
分区的主要作用是将整个分区作为管理单位, 选择存储策略, 比如副本数, 冷热策略和存储介质等等。一般选取时间列作为分区键,具体划分的粒度视数据量而定,单个分区原始数据量建议维持在100G以内。通过DorisDB的分区裁剪功能,最大限度地减少扫描数据量,从而提高查询性能。DorisDB支持在一个集群内使用多种存储介质(SATA/SSD)。用户可以将最新数据所在的分区放在SSD上,利用SSD的随机读写性能来提高查询性能。而老的数据可以放在SATA盘上,以节省数据存储的成本。
DorisDB采用Hash算法作为分桶算法,同一分区内, 分桶键的哈希值相同的数据形成(Tablet)子表, 子表多副本冗余存储, 子表副本在物理上由一个单独的本地存储引擎管理, 数据导入和查询最终都下沉到所涉及的子表副本上, 同时子表也是数据均衡和恢复的基本单位。
在DorisDB系统中,分桶是实际物理文件组织的单元。数据在写入磁盘后,就会涉及磁盘文件的管理。一般而言,我们不建议分桶数过大或过小,尽量适中会比较妥当。如果单个分桶数过小,则数据的聚合效果不佳,且元数据管理压力大。如果过大,则不利于副本的迁移、补齐,且会增加 Schema Change 或者 Rollup 操作失败重试的代价(这些操作失败重试的粒度是 Tablet)
根据经验而言,一般每个分桶的数据在1-10G,此处的10G指代的是原始数据。考虑到压缩比,压缩后磁盘上每个分桶数据文件大小在4~5G左右。这种模式在多数情况下足以满足业务需求。
建议用户根据集群规模的变化,建表时调整分桶的数量。集群规模变化,主要指节点数目的变化。假设现有100G原始数据,依照上述标准,可以建10个分桶。但是如果用户有20台机器,那么可以缩小每个分桶的数据量,加大分桶数。
对于DorisDB而言,分区和分桶的选择是非常关键的。在建表时选择好的分区分桶列,可以有效提高集群整体性能。当然,在使用过程中,也需考虑业务情况,根据业务情况进行调整。分桶列的选择,是在 查询吞吐和查询并发之间的一种权衡。
以下是针对特殊应用场景下,对分区和分桶选择的一些建议:
短查询:指扫描数据量不大,单机就能完成扫描的查询,此时使用筛选条件作为分桶列,可以减少机器间的数据交换,此时doris的功能类似于单机mysql
长查询:指扫描数据量大,多机并行扫描能显著提升性能,此时尽量使用多列甚至随机数作为分桶列,目的是把数据尽量打散,利用多机器并发。
分区和分桶在建表时就已经指定,无法更改,所以此处仅给出查询命令
SHOW DATA; #展示默认 db 的各个 table 的数据量,副本数量,汇总数据量和汇总副本数量,结果除以副本数,即表的数据量。
+-----------+-------------+--------------+
| TableName | Size | ReplicaCount |
+-----------+-------------+--------------+
| tbl1 | 900.000 B | 6 |
| tbl2 | 500.000 B | 3 |
| Total | 1.400 KB | 9 |
| Quota | 1024.000 GB | 1073741824 |
| Left | 1021.921 GB | 1073741815 |
+-----------+-------------+--------------+
SHOW DATA FROM example_db.test;#展示指定 db 的下指定表的细分数据量、副本数量和统计行数
+-----------+-----------+-----------+--------------+----------+
| TableName | IndexName | Size | ReplicaCount | RowCount |
+-----------+-----------+-----------+--------------+----------+
| test | r1 | 10.000MB | 30 | 10000 |
| | r2 | 20.000MB | 30 | 20000 |
| | test2 | 50.000MB | 30 | 50000 |
| | Total | 80.000 | 90 | |
+-----------+-----------+-----------+--------------+----------+
#1.展示指定db下指定表的所有分区信息
SHOW PARTITIONS FROM example_db.table_name;
#2.展示指定db下指定表的指定分区的信息
SHOW PARTITIONS FROM example_db.table_name WHERE PartitionName = "p1";
#3.展示指定db下指定表的最新分区的信息
SHOW PARTITIONS FROM example_db.table_name ORDER BY PartitionId DESC LIMIT 1;
语法:
SHOW TABLET
[FROM [db_name.]table_name | tablet_id] [partiton(partition_name_1, partition_name_1)]
[where [version=1] [and backendid=10000] [and state="NORMAL|ROLLUP|CLONE|DECOMMISSION"]]
[order by order_column]
[limit [offset,]size]
现在show tablet命令支持按照按照以下字段进行过滤:partition, index name, version, backendid,
state,同时支持按照任意字段进行排序,并且提供limit限制返回条数。