【发布时间】:2019-01-11 15:11:50
【问题描述】:
我仍在努力确定 azure sql 数据仓库中的表分布概念与 Sql server 中的表分区概念有何不同?
两者的定义似乎取得了相同的结果。
【问题讨论】:
标签: sql database azure-sql-database partitioning azure-sqldw
我仍在努力确定 azure sql 数据仓库中的表分布概念与 Sql server 中的表分区概念有何不同?
两者的定义似乎取得了相同的结果。
【问题讨论】:
标签: sql database azure-sql-database partitioning azure-sqldw
Azure DW 有多达 60 个计算节点作为其MPP architecture 的一部分。在 Azure DW 上存储表时,会将其存储在这些节点中。您的表数据分布在这些节点上(根据您的需要使用哈希分布或循环分布)。您还可以选择在这些节点之间复制您的表(最好是一个非常小的表)。
那是分布。每个节点都有自己独特的记录,只有该节点在与数据交互时才会担心这些记录。这是一个无共享的架构。
Partitioning 完全脱离了这种分配概念。当我们对表进行分区时,我们根据某种方案决定哪些行属于哪些分区(例如,通过order.create_date 对order 表进行分区)。每个create_date 的记录块然后存储在它自己的表中,与任何其他create_date 记录集分开(在幕后不可见)。
分区很好,因为您可能会发现您只想从表中选择价值 10 天的 orders,因此您只需读取 10 个较小的表,而不必扫描多年的 order 数据找到您之后的 10 天。
这是 Microsoft 网站上的一个示例,其中水平分区是在 name 列上完成的,其中两个“碎片”基于 names 字母顺序:
表分布是一个仅在 MPP 类型的 RDBMS(如 Azure DW 或 Teradata)上可用的概念。最容易将其视为与数据(在一定程度上)有些分离的硬件概念。 Azure 在这里为您提供了很多控制,其他 MPP 数据库基于主键的分布。几乎每个 RDBMS(无论是否为 MPP)都可以使用分区,并且最容易将其视为由表中的数据定义并依赖于表中数据的存储/软件概念。
最后,他们都在努力解决同一个问题。但是……几乎每个 RDBMS 概念(索引、磁盘存储、优化、分区、分布等)都是为了解决相同的问题。即:“我如何尽快获得我需要的确切数据?”当您将这些概念结合在一起以匹配您的数据检索需求时,即使面对巨大的数据,您的 SQL 请求也会变得非常快。
【讨论】:
只是为了好玩,请允许我打个比方。
假设存在一本关于世界所有历史的巨著。它有 42 层楼的大小。
现在,如果图书管理员每年将这本书分成 1 本书会怎样。这样可以更轻松地找到某些特定年份所需的所有信息。因为你可以把其他书放在书架上。
一本小书也更容易携带。
这就是表分区的意义所在。 (Reference: Data Partitioning in Azure)
基于对大多数查询有用且具有良好平均分布的键(或一组列)将数据块保存在一起。
这可以减少 IO,因为只需要访问相关的块。
现在,如果首席图书管理员解开那本书怎么办。并将页面集发送到许多不同的库。
当我们需要某些信息时,我们会要求每个图书馆向我们发送我们需要的页面的副本。
更好的是,那些图书馆员已经可以汇总他们页面的信息,然后只需将他们的摘要发送到一个为您收集它们的图书馆。
这就是表格分布的意义所在。 (Reference: Table Distribution Guidance in Azure)
将数据分布在不同的节点上。
【讨论】:
从概念上讲,它们是相同的。基本思想是将数据拆分到多个商店。但是,实现方式完全不同。在幕后,Azure SQL 数据仓库管理和维护您定义的每个表都在其中创建的 70 个数据库。除了定义键之外,您什么也不做。分配得到照顾。对于分区,您必须定义和维护几乎所有内容才能使其正常工作。还有更多,但你明白了核心思想。这些是在宏观层面上达到相似终点的不同过程和机制。但是,这些东西支持的过程是非常不同的。分布有助于提高性能,而分区主要是改进数据管理的一种手段(滚动窗口等)。尽管它们相似,但它们却有着不同的意图。
【讨论】: