执行并行查询及总结

举报
JavaEdge 发表于 2022/08/31 23:52:30 2022/08/31
【摘要】 5.1 执行并行查询至此,只关注了读/写入单K的简单查询(对文档分区的二级索引,要求分散/聚集查询)。这也是大多数NoSQL分布式数据存储所支持的访问类型。但对大规模并行处理(MPP, Massively parallel processing)这类主要用于数据分析的关系型数据库,在查询类型方面要复杂多了。典型的数仓查询包含多个连接,过滤,分组和聚合操作。 MPP查询优化器将复杂的查询分解成...

5.1 执行并行查询

至此,只关注了读/写入单K的简单查询(对文档分区的二级索引,要求分散/聚集查询)。这也是大多数NoSQL分布式数据存储所支持的访问类型。

但对大规模并行处理(MPP, Massively parallel processing)这类主要用于数据分析的关系型数据库,在查询类型方面要复杂多了。典型的数仓查询包含多个连接,过滤,分组和聚合操作。 MPP查询优化器将复杂的查询分解成许多执行阶段和分区,以便在DB集群的不同节点上并行执行。尤其是涉及全表扫描的查询,很受益于这种并行执行。

数仓查询的快速并行执行查询是个专门话题,分析业务日渐重要,可以带来很多利益。后文再详解。

总结

本文探讨了将大规模数据集划分成更小子集的各种方案。数据量太大,单台机器存储和处理就会成为瓶颈,因此需要引入数据分区机制。

分区的目标:通过多台机器均匀分布数据和查询负载,避免出现热点。这需要选择合适的数据分区方案,在节点添加或删除时,重新动态平衡分区。

主要的分区方案:

  • K范围分区

    先对K排序,每个分区只负责一段包含min到max K 范围的的一段K。排序的优势在于能支持高效的范围查询,但若应用程序经常访问某段K,就存在热点风险。这种方案,当分区太大时,通常将分区分成两个子分区,从而动态地再平衡分区。

  • hash分区

    将hash函数应用于每个K,每个分区负责一定范围的hash值。这种方案破坏了K的顺序,范围查询效率低下,但能更均匀分配负载。

    采用该方案分区时,一般预创建好足够且固定数量的分区,让每个节点承载多个分区,当添加或删除节点时,将某些分区从一个节点迁移到另一个节点。也可支持动态分区。

两种方案混用也可行,如使用联合K:

  • K的一部分来标识分区

  • 另一部分记录排序后的顺序

分区和二级索引之间的相互作用。二级索引也需要分区,有如下方案:

  • 基于文档分区二级索引(本地索引)。二级索引存储在与K相同的分区中,即写时只需要更新一个分区,但缺点是读二级索引时,需要在所有分区之间执行分散/收集

  • 基于词条分区二级索引(全局索引)。基于索引的值而进行的独立分区。二级索引中的条目可能包含来自K的多个分区里的记录。写入时,不得不更新二级索引的多个分区;但读时,可以从单个分区直接快速提取数据

最后,讨论如何将查询请求路由到正确的分区,包括简单的分区负载平衡到复杂的并行查询执行引擎。

理论上,每个分区基本独立运行,这也是为何试图将分区数据库可伸缩到多台机器的原因。但若需跨多个分区,就很复杂了,如若写一个分区成功,但另一个失败,后续会咋样?静等下文~

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。