SQL DW不支持主键、代理键或UNIQUE。
https://learn.microsoft.com/en-us/azure/sql-data-warehouse/sql-data-warehouse-tables-overview
如何防止重复的行?据我所知,一个受支持的选项IDENTITY
并不能阻止这种情况,它只是在每行的列中插入一个唯一的INT
值。
CREATE TABLE dbo.T1
(
C1 INT IDENTITY(1,1) NOT NULL,
C2 VARCHAR(30) NULL
)
WITH
( DISTRIBUTION = HASH(C2),
CLUSTERED COLUMNSTORE INDEX
);
INSERT INTO dbo.T1 VALUES (NULL);
INSERT INTO dbo.T1 VALUES (NULL);
-- You will see two rows
SELECT * FROM dbo.T1;
您可以通过检查值是否不存在来防止重复行。
通常,在数据仓库中,您要将一批数据从一个表移动到另一个表。
假设我有两个表,名称src和dst:
src (code,desc)
dst (code,desc)
只有当dst中还不存在代码时,我才想将src中的行追加到dst中。
一种典型的方法是使用NOT EXISTS子句:
insert into dst
select s.code, s.dest
from src s
where not exists (
select 1
from dest d
where d.code = s.code);
如果您希望代码和desc的组合是唯一的,只需扩展WHERE子句:
insert into dst
select s.code, s.dest
from src s
where not exists (
select 1
from dest d
where d.code = s.code
and d.desc = s.desc);
因为您使用的是Azure SQL数据仓库,所以您可能希望对集群列存储索引执行此操作。注意有关批量大小的文档。如果你的批次很小,你可能会得到糟糕的质量指标和糟糕的性能。在这种情况下,使用CTAS算法来重新创建维度,或者使用HEAP表而不是CCI。
https://learn.microsoft.com/en-us/azure/sql-data-warehouse/sql-data-warehouse-best-practices#optimize-集群列存储表
检查打击
CREATE TABLE #T1
(
C1 INT IDENTITY(1,1) NOT NULL,
C2 VARCHAR(30) NULL
)
--WITH
--( DISTRIBUTION = HASH(C2),
-- CLUSTERED COLUMNSTORE INDEX
--);
INSERT INTO #T1 VALUES (NULL);
INSERT INTO #T1 VALUES (NULL);
select *
from (
select *
,Rank_1 = row_number() over(partition by Check_1 order by C1)
from (
SELECT *
--,Rank_1 = row_number() over(partition by C1 order by C1)
,Check_1 = case when isnull(C2,'N/A') = 'N/A' then 'DupVals' else 'Non-DupVals' end
FROM #T1
) a
)b
where Rank_1 = 1
;