Лучший способ сравнить два набора данных с SQL - PullRequest
0 голосов
/ 06 апреля 2019

У меня есть запрос, который захватывает набор данных. Этот запрос выполняется в определенное время. Затем, через 30 минут, у меня есть другой запрос (тот же синтаксис), который запускается и получает тот же набор данных. Наконец, у меня есть третий запрос (который является рассматриваемым запросом), который сравнивает оба набора данных. Извлекаемые им записи соответствуют: если "FEDVIP_Active" был ЛОЖЬ в первом наборе данных и ИСТИНА во втором наборе данных, ИЛИ"UniqueID" не существовало в первый набор данных и делает во втором наборе данных И FEDVIP_Active ИСТИНА. Я подвергаю сомнению эффективность запроса ниже, который делает сравнение. Время истекает через 30 минут. Есть ли что-нибудь, что вы можете видеть, что я не должен делать, чтобы быть наиболее эффективным в беге? Два сравниваемых набора данных с одинаковыми номерами содержат около миллиона записей в каждом.

Первый запрос, который захватывает начальный набор данных:

select Unique_ID, First_Name, FEDVIP_Active, Email_Primary
from Master_Subscribers_Prospects

Второй запрос точно такой же, как и первый.

Затем третий запрос ниже сравнивает данные:

select 
    a.FEDVIP_Active, 
    a.Unique_ID, 
    a.First_Name, 
    a.Email_Primary
from 
    Master_Subscribers_Prospects_1 a
inner join
    Master_Subscribers_Prospects_2 b
    on 1 = 1
where a.FEDVIP_Active = 1 and b.FEDVIP_Active = 0 or
(b.Unique_ID not in (select Unique_ID from Master_Subscribers_Prospects_1) and b.FEDVIP_Active = 1)

Ответы [ 3 ]

1 голос
/ 06 апреля 2019

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

Тогда вместо IN EXISTS часто работает лучше, когда количество строк в подзапросе велико.

Но я думаю, что вам вообще не нужны IN или EXITS.

Предполагая, что unique_id идентифицирует запись и не является нулевым, вы можете присоединить первую таблицу ко второй на общих unique_id s. Тогда тогда и только тогда, когда ни одна запись для unique_id во второй таблице не выйдет из unique_id первой таблицы в результате объединения, будет нулевым, так что вы можете проверить это.

SELECT b.fedvip_active, 
       b.unique_id, 
       b.first_name,
       b.email_primary
       FROM master_subscribers_prospects_2 b
            LEFT JOIN master_subscribers_prospects_1 a
                      ON b.unique_id = a.unique_id
       WHERE a.fedvip_active = 1 
             AND b.fedvip_active = 0
              OR a.unique_id IS NULL
                 AND b.fedvip_active = 1;

Для этого индексы запросов на master_subscribers_prospects_1 (unique_id, fedvip_active) и master_subscribers_prospects_2 (unique_id, fedvip_active) также могут помочь ускорить процесс.

1 голос
/ 06 апреля 2019

Если я правильно понимаю, вам нужны все записи из второго набора данных, в которых соответствующий уникальный идентификатор в первом наборе данных не активен (либо не существует, либо установлен флаг неактивным).

Я бы предложил exists:

select a.*
from Master_Subscribers_Prospects_1 a
where a.FEDVIP_Active = 1 and
      not exists (select 1
                  from Master_Subscribers_Prospects_2 b
                  where b.Unique_ID = a.Unique_ID and
                        b.FEDVIP_Active = 1
                 );

Для производительности вам нужен индекс на Master_Subscribers_Prospects_2(Unique_ID, FEDVIP_Active).

0 голосов
/ 06 апреля 2019

Выполнение внутреннего выбора, когда sats всегда плох.

Вот та же версия с left join, которая может работать для вас.

select 
    a.FEDVIP_Active, 
    a.Unique_ID, 
    a.First_Name, 
    a.Email_Primary
from 
    Master_Subscribers_Prospects_1 a
inner join
    Master_Subscribers_Prospects_2 b on 1 = 1
left join Master_Subscribers_Prospects_1 sa on sa.Unique_ID = b.Unique_ID 
where (a.FEDVIP_Active = 1 and b.FEDVIP_Active = 0) or
(sa.Unique_ID is null and b.FEDVIP_Active = 1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...