Совместное и существующее исполнение

Вообще говоря, есть ли разница в производительности между использованием JOIN для выбора строк и предложением EXISTS where? Поиск по различным веб-сайтам вопросов и ответов показывает, что объединение более эффективно, но я вспоминаю, как давно узнал, что EXISTS лучше в Teradata.

Я вижу другие ответы SO, какэто а такжеэто, но мой вопрос специфичен для Teradata.

Например, рассмотрим эти два запроса, которые возвращают идентичные результаты:

select   svc.ltv_scr, count(*) as freq
from     MY_BASE_TABLE svc
join     MY_TARGET_TABLE x
on       x.srv_accs_id=svc.srv_accs_id
group by 1
order by 1

-а также-

select   svc.ltv_scr, count(*) as freq
from     MY_BASE_TABLE svc
where exists(
    select 1
    from   MY_TARGET_TABLE x
    where  x.srv_accs_id=svc.srv_accs_id)
group by 1
order by 1

Основным индексом (уникальным) для обеих таблиц является 'srv_accs_id'. MY_BASE_TABLE довольно большой (200 миллионов строк), а MY_TARGET_TABLE относительно небольшой (200 000 строк).

Есть одно существенное отличие в планах EXPLAIN: первая говорит, что две таблицы объединены"путем сканирования совпадений RowHash" а второй говорит"путем сканирования всех строк", Оба говорят, что это"шаг всех AMPs JOIN" и общее расчетное время идентично (0,32 секунды).

Оба запроса выполняются одинаково (я использую Teradata 13.10).

Аналогичный эксперимент по поиску несоответствий, сравнивающих LEFT OUTER JOIN с соответствующим предложением IS NULL where для подзапроса NOT EXISTS, показывает разницу в производительности:

select   svc.ltv_scr, count(*) as freq
from     MY_BASE_TABLE svc
left outer join MY_TARGET_TABLE x
on       x.srv_accs_id=svc.srv_accs_id
where    x.srv_accs_id is null
group by 1
order by 1

-а также-

select   svc.ltv_scr, count(*) as freq
from     MY_BASE_TABLE svc
where not exists(
    select 1
    from   MY_TARGET_TABLE x
    where  x.srv_accs_id=svc.srv_accs_id)
group by 1
order by 1 

Второй план запроса работает быстрее (2,21 против 2,14 секунды, как описано в EXPLAIN).

Мой пример может быть слишком тривиальным, чтобы увидеть разницу; Я просто ищу руководство по кодированию.

Ответы на вопрос(1)

Ваш ответ на вопрос