Хранилище данных Azure Генерируйте последовательный более быстрый запрос - PullRequest
0 голосов
/ 28 октября 2019

Среда - Azure DW. У меня есть необработанная таблица, подобная приведенной ниже;

ID   Start   End   Action        date
1     10     15    Processed     25-10-2019
2     55     105   In-Progress   21-10-2019
.....

Мне нужно расширить / преобразовать столбцы Start и End так, чтобы они стали серийными номерами;

SN      Action        date
10      Processed     25-10-2019
11      Processed     25-10-2019
12      Processed     25-10-2019
13      Processed     25-10-2019
14      Processed     25-10-2019
.....

Хранилище данных Azure не поддерживает рекурсивные CTE или Cursor. Итак, попробовал цикл while,



create table #temp_output (SerialNumber int not null, startSerialNumber int not null, endSerialNumber int not null);
insert into #temp_output select startSerialNumber, startSerialNumber, endSerialNumber from  dbo.raw
declare @rowcount int, @cnt int, @start int, @end int
set @cnt = 1
set @rowcount = (select count(*) from dbo.raw)
while @cnt <= @rowcount
begin
select top (@cnt) @start = startSerialNumber from dbo.raw
select top (@cnt) @end = endSerialNumber from dbo.raw
while @start <= @end
begin
       insert #temp_output
       select max(SerialNumber) + 1,
       startSerialNumber,
       endSerialNumber
       from #temp_output group by startSerialNumber, endSerialNumber having max(SerialNumber) < endSerialNumber
       set @start = @start + 1
       end
       set @cnt = @cnt + 1
       end
       select SerialNumber, startSerialNumber, endSerialNumber from #temp_output_delta order by SerialNumber

Однако на это уходит целая вечность (6 часов, когда я отменил запрос), поскольку в необработанной таблице 50 миллионов строк.

Нужен лучший способдля этого.

Обновленная информация 31-10-2019

Распределением для исходной таблицы является хеш. 500 DWu. 60 миллионов строк в исходной таблице. Средняя разница между началом и концом 3000. Старт также может быть 2 миллиона. Нет индекса на основной таблице. Число столбцов 15 Кластерный индекс columnstore для необработанной таблицы.

1 Ответ

2 голосов
/ 28 октября 2019

Ваш образец неполный, но вам не нужен цикл. Вы можете присоединить его к таблице подсчета, используя BETWEEN

Если у вас есть таблица подсчета (которая представляет собой таблицу с числом от 1 до ... 1 миллиона)

 SELECT T.TallyNumber As SN, E.Action, E.Date
 FROM YourTable E
 INNER JOIN TallyTable As T
 ON T.TallyNumber BETWEEN E.Start AND E.End

Так как вы загружаете это в новую таблицу, вы должны использовать CTAS

CREATE TABLE [dbo].[NewTable]
WITH
(
 DISTRIBUTION = HASH([Start])
 ,CLUSTERED COLUMNSTORE INDEX
)
AS
 SELECT T.TallyNumber As SN, E.Action, E.Date
 FROM YourTable E
 INNER JOIN TallyTable As T
 ON T.TallyNumber BETWEEN E.[Start] AND E.[End];

Обратите внимание, что вокруг DISTRIBUTION очень много дизайна. Вы должны получить это право на производительность. Вышеприведенное утверждение является лишь примером. Вероятно, вам следует использовать другой хеш.

Вам необходимо правильно распределить две исходные таблицы, а также таблицу назначения для обеспечения хорошей производительности.

...