Совместное и существующее исполнение
Вообще говоря, есть ли разница в производительности между использованием 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).
Мой пример может быть слишком тривиальным, чтобы увидеть разницу; Я'Я просто ищу руководство по кодированию.