Azure Syanaps Analytics 専用SQLプールでは、以下の記事の通り主キーや一意キーが機能しません。
注意が必要な一意キー、主キーの利用(Azure Synapse Analytics SQLプール)
一方で行の重複を防ぐ必要がある場面は多々発生します。
行の重複を防ぐためにいつも行っている方法を記載します。
値が存在しないことを確認することで行の重複を防ぐ
一般的にDWHシステムでは、テーブルから別のテーブルへデータの移動を行うことが多いと思います。
例えば、以下のような2つのテーブルがあるとします。
stg_table(id,desc_col)
prd_table(id,desc_col)
データがprd_table
にまだ存在しない行のみ、stg_table
からprd_table
にデータ移動を行いたいと思います。
これはよくあるシナリオだと思いますが、ここでよく利用するのはNOT EXIST
を利用することです。
insert into prd_table
select
s.id,s.desc_col
from
stg_table s
where not exists(
select 1
from prd_table p
where p.id = s.id
);
また、id
とdesc_col
を合わせて一意にしたい場合にはWHERE句を少し拡張します。
insert into prd_table
select
s.id,s.desc_col
from
stg_table s
where not exists(
select 1
from prd_table p
where
p.id = s.id
and p.desc_col = s.desc_col
);
クラスター化列ストアインデックスで細かくデータをインサートする場合は断片化などでパーフォーマンスが低下する可能性があるので、CTAS
を使って再作成したり、クラスター化列ストアインデックスの代わりにHEAPテーブルを使うなどの注意が必要な場合があります。