SQL Server: Как сделать самосоединение с помощью команды case более эффективным?

#sql-server

Вопрос:

У меня есть следующая структура данных в таблице, содержащей 56 миллионов строк. Вот как это структурировано:

 create table #table (
    researcher nvarchar(20),
    unit nVARCHAR(20),
    paper int,
    general_type nvarchar(20));
insert into #table (researcher,
                    unit,
                    paper,
                    general_type)
Values ('R1', 'A', 1, 'O'),
('R1', 'A', 2, 'O'),
('R1', 'A', 3, 'O'),
('R1', 'B', 4, 'N'),
('R1', 'B', 5, 'N'),
('R1', 'B', 6, 'N'),
('R2', 'B', 7, 'O'),
('R2', 'B', 8, 'O'),
('R2', 'A', 9, 'N');
 

Задача состоит в том, чтобы выполнить внутреннее соединение в одной и той же таблице (т. Е. Соединить таблицу с самой собой и выполнить обращение на основе general_type столбца в таблице. В настоящее время я делаю вот так:

 select a.researcher,
       a.unit as unit_source,
       b.unit as unit_target,
       a.paper,
       a.general_type as general_type_source,
       b.general_type as general_type_target,
       case
       when a.unit = b.unit then 'Resident'
       else case
            when a.general_type = 'O'
            and b.general_type  = 'N' then 'Before' 
            else case
                when a.general_type = 'N'
                and b.general_type  = 'O' then 'After' 
                else case
                    when a.general_type = 'N'
                    and b.general_type  = 'N' then 'Before'
                    else case
                            when a.general_type = 'O'
                            and b.general_type  = 'O'
                            and a.unit != b.unit then 'Before' 
       else 'error' end end end end end as relationship
  from #table as a
  join #table as b
    on a.researcher = b.researcher;
 

Проблема в том, что текущий запрос создает таблицу, которая становится слишком большой для системы баз данных (1,5 Терабайта данных).

Мне нужно создать таблицу более эффективным способом, не используя 1,5 терабайта временного пространства. Как я могу это сделать, не ставя под угрозу результат, так как мне нужны все записи.

Комментарии:

1. вы пробовали разделить запрос на объединение части, поскольку они взаимно исключают друг друга, вы можете использовать параметр «регистр» для фильтрации соединений

2. @nbk еще не пробовал, попробую сейчас

3.Вам нужно distinct , так как это замедлит его и принудит к хэшу или сортировке. перекрестное соединение в 56 миллионов строк будет массовым, каким бы способом вы это ни сделали, я предлагаю вам переосмыслить это и понять, чего вы на самом деле пытаетесь достичь (здесь неясно).

4. Если это то, что вы действительно хотите сделать, это будет лучше работать на облачной платформе «больших данных». Например, гипермасштабирование SQL Azure. Вам нужно будет заплатить, но вы получите платформу, которая расширится, чтобы делать то, что вам нужно, и вы сможете прекратить платить, когда закончите свой анализ. Если это то, чем вы занимаетесь регулярно, вам, возможно, захочется изучить такие технологии, как базы данных, которые являются своего рода кривой обучения, но пригодны для обработки больших наборов данных.

5. Мой другой комментарий: что вы делаете с этими 1,5 терабайтами данных? каков здесь следующий шаг?