【问题标题】:How to add a partition boundary only when not exists in SQL Data Warehouse?仅当 SQL 数据仓库中不存在时,如何添加分区边界?
【发布时间】:2019-02-18 23:50:42
【问题描述】:

我正在使用 Azure SQL 数据仓库 Gen 1,我创建了一个这样的分区表

CREATE TABLE [dbo].[StatsPerBin1](
[Bin1] [varchar](100) NOT NULL,
[TimeWindow] [datetime] NOT NULL,
[Count] [int] NOT NULL,
[Timestamp] [datetime] NOT NULL)
WITH
(
    DISTRIBUTION = HASH ( [Bin1] ),
    CLUSTERED INDEX([Bin1]),
    PARTITION
    (
        [TimeWindow] RANGE RIGHT FOR VALUES ()
     )
)

如果没有这样的边界,我应该如何分割一个分区?

首先我想如果我可以通过表名获取分区边界,那么我可以编写一个 if 语句来确定是否添加分区边界。

但是我找不到将表与其对应的分区值关联的方法,所有分区的分区值都可以通过

SELECT * FROM sys.partition_range_values

但它只包含 function_id 作为标识符,我不知道如何加入其他表,以便我可以通过表名获取分区边界。

【问题讨论】:

  • 你认为为什么需要分区?你的表有多少行?我问是因为分区虽然在 SQL Server 中很自然,但在 ASDW 中可能是一种反模式。
  • 我需要按月截断数据进行内务处理,每个月生成3亿条记录是不可能逐条删除的。
  • Lucas,根据您在 ELT 流程中的其他操作,您可能会发现对表进行 CTAS 更有效,不包括要删除的行。也就是说,每月 3 亿次让您进入分区开始成为一种有用技术的范围。

标签: azure-sqldw sql-data-warehouse


【解决方案1】:

您是否尝试过以sys.partition_functions 视图加入sys.partition_range_values

虽然我们无法在 SQL DW 中创建分区函数,但该视图似乎仍受支持。

【讨论】:

    【解决方案2】:

    我知道这是一个过时的问题,但我遇到了同样的问题。这是我最终得到的一个查询,可以帮助您入门。对 SQL Server 文档的查询稍作修改:

    SELECT      s.[name]                        AS      [schema_name]
    ,           t.[name]                        AS      [table_name]
    ,           p.[partition_number]            AS      [partition_number]
    ,           rv.[value]                      AS      [partition_boundary_value]
    ,           p.[data_compression_desc]       AS      [partition_compression_desc]
    FROM        sys.schemas s
    JOIN        sys.tables t                    ON      t.[schema_id]         = s.[schema_id]
    JOIN        sys.partitions p                ON      p.[object_id]         = t.[object_id]
    JOIN        sys.indexes i                   ON      i.[object_id]         = p.[object_id]
                                                AND     i.[index_id]          = p.[index_id]
    JOIN        sys.data_spaces ds              ON      ds.[data_space_id]    = i.[data_space_id]
    LEFT JOIN   sys.partition_schemes ps        ON      ps.[data_space_id]    = ds.[data_space_id]
    LEFT JOIN   sys.partition_functions pf      ON      pf.[function_id]      = ps.[function_id]
    LEFT JOIN   sys.partition_range_values rv   ON      rv.[function_id]      = pf.[function_id]
                                                AND     rv.[boundary_id]      = p.[partition_number]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-04
      • 2016-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-07
      相关资源
      最近更新 更多