2016-10-24 6 views
-3

Запрос:NETEZZA: Может ли LEFT JOIN быть быстрее, чем INNER JOIN?

SELECT * FROM TABLE1 TBL 
INNER JOIN CROSS_REF_TABLE XREF 
ON TBL.COL = XREF.COL 

VS

SELECT * FROM TABLE1 TBL 
LEFT JOIN CROSS_REF_TABLE XREF 
ON TBL.COL = XREF.COL 
WHERE XREF.COL IS NOT NULL 

Может LEFT JOIN быстрее, чем внутреннее соединение? В моем случае по какой-то причине я вижу, что LEFT JOIN работает быстрее.

ПРИМЕЧАНИЕ. Все таблицы имеют случайное распределение.

Когда я смотрю план выполнения, разница между двумя с добавленным распределением по таблице перекрестных ссылок.

LEFT JOIN:

Node 32. 
    [SPU Sequential Scan table "CROSS_REF_TABLE XREF" as "XREF" {}] 
     -- Estimated Rows = 129044, Width = 18, Cost = 0.0 .. 0.2, Conf = 100.0 
     Projections: 
     1:XREF.ORG_SK 2:XREF.COL 
    [SPU Distribute on {(XREF.COL)}] 
    [HashIt for Join] 

INNER JOIN:

Node 3. 
    [SPU Sequential Scan table "CROSS_REF_TABLE XREF" as "XREF" {}] 
     -- Estimated Rows = 129044, Width = 18, Cost = 0.0 .. 0.4, Conf = 100.0 
     Projections: 
     1:XREF.ORG_SK 2:XREF.COL 
    [HashIt for Join] 

ли Netezza LEFT JOIN вложенную Loop или хеширования?

+1

Несомненно, операция объединения, которую он выбирает, будет основываться на оценочном количестве строк, а не на выборе левого или внутреннего соединения. – TZHX

+1

Оба вопроса в вашем вопросе идентичны и используют внешнее соединение. –

+0

Поскольку Inner & Left join возвращают два разных результата, главный вопрос должен быть: * Какой результат мне нужен? * – dnoeth

ответ

0

Хотя это МОЖЕТ быть истинным в некоторых случаях, утверждение в заголовке чрезвычайно упрощено и указывает на причинность, когда существует только ограниченная корреляция.

Если бы вы изменили вас тему, чтобы «это могло произойти в реальной жизни, что внутреннее соединение и левое соединение не равны по скорости, даже если они равны в результате», все ответы будут «да»

Есть буквально сотни примеров этого в SQL (= versus> = AND < =, существует против «в подвыборке», как и в сравнении с равным, как и между, event_time = (подвыбор max (event_time) за ключ и соединение ключ для выбора ключа, max (event_time) и т. д.), но результаты будут отличаться от базы данных к базе данных и даже по версиям программного обеспечения той же базы данных.

Одна вещь, которая ВСЕГДА имеет тенденцию выравнивать эти различия (и как правило, повышают производительность) заключается в обновлении статистики по всем таблицам, участвующим в запросе, и ограничению числа объединений между большой таблицей и точками where, которые ограничивают максимальный конечный результат (избегайте использования снежинки на звезду)

Смежные вопросы