【问题标题】:What is a difference between table distribution and table partition in sql?sql中的表分布和表分区有什么区别?
【发布时间】:2019-01-11 15:11:50
【问题描述】:

我仍在努力确定 azure sql 数据仓库中的表分布概念与 Sql server 中的表分区概念有何不同?

两者的定义似乎取得了相同的结果。

【问题讨论】:

    标签: sql database azure-sql-database partitioning azure-sqldw


    【解决方案1】:

    Azure DW 有多达 60 个计算节点作为其MPP architecture 的一部分。在 Azure DW 上存储表时,会将其存储在这些节点中。您的表数据分布在这些节点上(根据您的需要使用哈希分布或循环分布)。您还可以选择在这些节点之间复制您的表(最好是一个非常小的表)。

    那是分布。每个节点都有自己独特的记录,只有该节点在与数据交互时才会担心这些记录。这是一个无共享的架构。


    Partitioning 完全脱离了这种分配概念。当我们对表进行分区时,我们根据某种方案决定哪些行属于哪些分区(例如,通过order.create_dateorder 表进行分区)。每个create_date 的记录块然后存储在它自己的表中,与任何其他create_date 记录集分开(在幕后不可见)。

    分区很好,因为您可能会发现您只想从表中选择价值 10 天的 orders,因此您只需读取 10 个较小的表,而不必扫描多年的 order 数据找到您之后的 10 天。

    这是 Microsoft 网站上的一个示例,其中水平分区是在 name 列上完成的,其中两个“碎片”基于 names 字母顺序:


    表分布是一个仅在 MPP 类型的 RDBMS(如 Azure DW 或 Teradata)上可用的概念。最容易将其视为与数据(在一定程度上)有些分离的硬件概念。 Azure 在这里为您提供了很多控制,其他 MPP 数据库基于主键的分布。几乎每个 RDBMS(无论是否为 MPP)都可以使用分区,并且最容易将其视为由表中的数据定义并依赖于表中数据的存储/软件概念。

    最后,他们都在努力解决同一个问题。但是……几乎每个 RDBMS 概念(索引、磁盘存储、优化、分区、分布等)都是为了解决相同的问题。即:“我如何尽快获得我需要的确切数据?”当您将这些概念结合在一起以匹配您的数据检索需求时,即使面对巨大的数据,您的 SQL 请求也会变得非常快。

    【讨论】:

    • 分区发生在各个发行版中。从概念上讲,您可以在每个发行版中使用不同的分区策略,尽管 Azure SQL 数据仓库不支持。
    • @DavidBrowne-Microsoft 我已经删除了建议分区已分发的句子。这很有趣。我需要详细了解 Azure 的 MPP 实现的细节。我习惯在 Teradata 工作,这很相似,但也完全没有。
    • SQL DW 用语中的分发或分发数据库实际上是指构成每个 SQL DW 实例的 60 个底层数据库之一。 SQL DW 的一个实例可以由 1 - 60 个计算节点提供支持,并且实际节点数必须能被 60 整除,因此每个节点将为相同数量的分发数据库提供支持。在 channel9 和 youtube 上有关于 SQL DW 最佳实践的演示,涵盖了分区的好、坏和丑陋,值得回顾。简而言之,您需要拥有大量数据才能在 SQL DW 中进行表分区。
    【解决方案2】:

    只是为了好玩,请允许我打个比方。

    假设存在一本关于世界所有历史的巨著。它有 42 层楼的大小。

    现在,如果图书管理员每年将这本书分成 1 本书会怎样。这样可以更轻松地找到某些特定年份所需的所有信息。因为你可以把其他书放在书架上。
    一本小书也更容易携带。

    这就是表分区的意义所在。 (Reference: Data Partitioning in Azure)
    基于对大多数查询有用且具有良好平均分布的键(或一组列)将数据块保存在一起。
    这可以减少 IO,因为只需要访问相关的块。

    现在,如果首席图书管理员解开那本书怎么办。并将页面集发送到许多不同的库。 当我们需要某些信息时,我们会要求每个图书馆向我们发送我们需要的页面的副本。
    更好的是,那些图书馆员已经可以汇总他们页面的信息,然后只需将他们的摘要发送到一个为您收集它们的图书馆。

    这就是表格分布的意义所在。 (Reference: Table Distribution Guidance in Azure)
    将数据分布在不同的节点上。

    【讨论】:

    • 这是一个很好的类比。要求每个图书馆发送我们需要的任何页面比只使用大书要慢,如果大书相对较小,但如果它非常巨大并且需要数周时间来整理整个内容,那么让 60 名图书馆员搜索他们的特定部分(无共享架构),然后发送他们发现的内容,即使通过蜗牛邮件,它仍然更快。
    • 感谢这个惊人的类比。
    【解决方案3】:

    从概念上讲,它们是相同的。基本思想是将数据拆分到多个商店。但是,实现方式完全不同。在幕后,Azure SQL 数据仓库管理和维护您定义的每个表都在其中创建的 70 个数据库。除了定义键之外,您什么也不做。分配得到照顾。对于分区,您必须定义和维护几乎所有内容才能使其正常工作。还有更多,但你明白了核心思想。这些是在宏观层面上达到相似终点的不同过程和机制。但是,这些东西支持的过程是非常不同的。分布有助于提高性能,而分区主要是改进数据管理的一种手段(滚动窗口等)。尽管它们相似,但它们却有着不同的意图。

    【讨论】:

      猜你喜欢
      • 2013-10-08
      • 2019-11-13
      • 1970-01-01
      • 2015-10-03
      • 2014-12-12
      • 2018-03-10
      • 2015-12-12
      • 2016-02-01
      • 1970-01-01
      相关资源
      最近更新 更多