检测到您已登录华为云国际站账号,为了您更好的体验,建议您访问国际站服务网站 https://www.huaweicloud.com/intl/zh-cn
不再显示此消息
什么是数据倾斜,如何检查? 答:数据倾斜即多个DN内数据分布不均,对于hash分表策略,如果分布列选择不当,可能导致数据倾斜,查询时部分DN出现效率短板,从而影响整体查询性能。因此在采用Hash分表策略之后需对表的数据定期进行数据倾斜性检查或监控,以确保数据在各个DN上是均匀分布
行级修改操作在历史表中的执行序号。 hash_ins hash16 INSERT或UPDATE操作插入的数据行的hash值。 hash_del hash16 DELETE或UPDATE操作删除数据行的hash值。 pre_hash hash32 当前用户历史表的数据整体摘要。 表2 hash_ins与hash_del场景对应关系
gs_stat_get_hotkeys_info() order by count, hash_value; database_name | schema_name | table_name | key_value | hash_value | count ---------------
gs_stat_get_hotkeys_info() order by count, hash_value; database_name | schema_name | table_name | key_value | hash_value | count ---------------
gs_stat_get_hotkeys_info() order by count, hash_value; database_name | schema_name | table_name | key_value | hash_value | count ---------------
创建表tri_insert。 gaussdb=# CREATE TABLE tri_insert (a int, b int) distribute by hash(a); CREATE TABLE -- 创建函数trigger_func。 gaussdb=# CREATE FUNCTION trigger_func()
行级修改操作在历史表中的执行序号。 hash_ins hash16 INSERT或UPDATE操作插入的数据行的hash值。 hash_del hash16 DELETE或UPDATE操作删除数据行的hash值。 pre_hash hash32 当前用户历史表的数据整体摘要。 表2 hash_ins与hash_del场景对应关系
创建表tri_insert。 gaussdb=# CREATE TABLE tri_insert (a int, b int) distribute by hash(a); CREATE TABLE -- 创建函数trigger_func。 gaussdb=# CREATE FUNCTION trigger_func()
区母表在pg_class表中的OID列。 示例:t1_hash为一个分区表: gaussdb=# CREATE TABLE t1_hash (c1 INT, c2 INT, c3 INT) PARTITION BY HASH(c1) ( PARTITION p0,
Output: t1.c2 Node/s: All datanodes -> Hash Join Output: t1.c2 Hash Cond: (t2.c1 = t1.c2) -> Seq Scan on
母表在pg_class表中的OID列。 示例:t1_hash为一个一级分区表: gaussdb=# CREATE TABLE t1_hash (c1 INT, c2 INT, c3 INT) PARTITION BY HASH(c1) ( PARTITION p0,
母表在pg_class表中的oid列。 示例1:t1_hash为一个分区表: gaussdb=# CREATE TABLE t1_hash (c1 INT, c2 INT, c3 INT) PARTITION BY HASH(c1) ( PARTITION p0,
表在pg_class表中的oid列。 示例1:t1_hash为一个一级分区表: gaussdb=# CREATE TABLE t1_hash (c1 INT, c2 INT, c3 INT) PARTITION BY HASH(c1) ( PARTITION p0,
public.range_part t2 ON t1.a = t2.a Datanode Name: datanode1 Hash Join Hash Cond: (t1.a = t2.a) -> Partition Iterator Iterations:
如果建表时没有指定分布列,数据会怎么存储? 答:建表时没有指定分布列,数据会以如下三种场景存储: 若建表时包含主键/唯一约束,则选取HASH分布,分布列为主键/唯一约束对应的列。 gaussdb=# CREATE TABLE tb_test1 ( W_WAREHOUSE_SK
--------------------------------------------------------- Hash Join Hash Cond: (t1.a = t2.a) -> Partition Iterator Iterations:
二级分区(Range/Hash) O(1) + O(1) = O(1) 二分查找+哈希 二级分区(Hash/List) O(1) + O(1) = O(1) 哈希+哈希 二级分区(Hash/Range) O(1) + O(1) = O(1) 哈希+二分查找 二级分区(Hash/Hash) O(1)
复杂度上,Sort算法需要排序至少O(nlogn)的时间,虽说Hash算法和HLL一样扫描一次全表O(n)的时间就可以得出结果,但是存储空间上,Sort算法和Hash算法都需要先把原始数据存起来再进行统计,会导致存储空间消耗巨大,而对HLL来说不需要存原始数据,只需要维护HLL数
二级分区(Range/Hash) O(1) + O(1) = O(1) 二分查找+哈希 二级分区(Hash/List) O(1) + O(1) = O(1) 哈希+哈希 二级分区(Hash/Range) O(1) + O(1) = O(1) 哈希+二分查找 二级分区(Hash/Hash) O(1)
删除分区 用户可以使用删除分区的命令来移除不需要的分区。删除分区可以通过指定分区名或者分区值来进行。 删除分区不能作用于HASH分区上。 执行删除分区命令会使得Global索引失效,可以通过UPDATE GLOBAL INDEX子句来同步更新Global索引,或者用户自行重建Global索引。