Как предотвратить дублирование в SQL DW без первичных ключей? - PullRequest
0 голосов
/ 29 ноября 2018

SQL DW не поддерживает первичные ключи или суррогатные ключи или УНИКАЛЬНЫЕ.

https://docs.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;

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018

Вы предотвращаете дублирование строк, проверяя, что значение еще не существует.

Как правило, в хранилище данных вы перемещаете пакеты данных из одной таблицы в другую.

Давайте предположим, что у меня есть две таблицы с именами src и dst:

src (code,desc)
dst (code,desc)

Я хочу добавить строки из src в dst, только если код еще не существует в 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);

Поскольку вы используете хранилище данных SQL Azure, есть вероятность, что вы захотите сделать это для кластерного индекса columnstore.Принять к сведению документацию о размерах партии.Если ваши партии небольшие, вы можете получить показатели плохого качества и плохую производительность.В этом случае используйте алгоритм CTAS для воссоздания измерения или используйте таблицу HEAP вместо CCI.

https://docs.microsoft.com/en-us/azure/sql-data-warehouse/sql-data-warehouse-best-practices#optimize-clustered-columnstore-tables

0 голосов
/ 29 ноября 2018

Проверка удара

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
;
...