问题描述
我正在使用专用 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
)
解决方法
是的,你可以!您可以将任何列用作散列分布列,但请注意,这会在您的表中引入一个约束:您不能删除或更改分布列。
使用散列分布列有两个原因:一个是为了防止跨分布查询的数据移动,但另一个是确保跨分布均匀分布数据,以确保所有工作人员在查询中得到有效使用。通过非偏斜列进行哈希分布,即使不是唯一的,也可以帮助解决第二种情况。
但是,如果您确实希望按主键进行分发,请考虑通过将复合主键的不同列散列在一起来创建复合主键。您可以通过散列键进行散列分布,如果您稍后需要对该散列键进行更新插入,这也有望减少数据移动。