Azure Synapse Analytics:我可以使用非唯一列作为哈希分布式表中的哈希列吗?

问题描述

我正在使用专用 sql 池(又名 Azure Synapse Analytics)。尝试优化事实表和 according to documentation FACT 表应该散列分布以获得更好的性能

问题在于:

  • 我的事实表有一个复合主键。
  • 您只能将列指定为哈希分布列。

我可以使用其中一列作为分布列吗?任何一列都会有重复项,尽管它们都是 NOT NULL

CREATE TABLE myTable
(
    [ITEM] [varchar](50) NOT NULL,[LOC] [varchar](50) NOT NULL,[MEASURE] [varchar](50) NOT NULL
 CONSTRAINT [PK] PRIMARY KEY NONCLUSTERED 
    (
        [LOC] ASC,[ITEM] ASC
    ) NOT ENFORCED 
)
WITH
(
    disTRIBUTION = HASH([ITEM]),CLUSTERED COLUMNSTORE INDEX
)

解决方法

是的,你可以!您可以将任何列用作散列分布列,但请注意,这会在您的表中引入一个约束:您不能删除或更改分布列。

使用散列分布列有两个原因:一个是为了防止跨分布查询的数据移动,但另一个是确保跨分布均匀分布数据,以确保所有工作人员在查询中得到有效使用。通过非偏斜列进行哈希分布,即使不是唯一的,也可以帮助解决第二种情况。

但是,如果您确实希望按主键进行分发,请考虑通过将复合主键的不同列散列在一起来创建复合主键。您可以通过散列键进行散列分布,如果您稍后需要对该散列键进行更新插入,这也有望减少数据移动。