2016-12-11 3 views
2

Мне нужно подключить огромную таблицу (10 миллионов плюс строки) к таблице поиска (15k плюс строки) с условием ИЛИ. Что-то вроде:Redshift - эффективное предложение JOIN с OR

SELECT t1.a, t1.b, nvl(t1.c, t2.c), nvl(t1.d, t2.d) 
FROM table1 t1 
JOIN table2 t2 ON t1.c = t2.c OR t1.d = t2.d; 

Это потому, что table1 может иметь c или d как NULL, и я хотел бы присоединиться в зависимости от того, есть в наличии, оставляя все остальное. В плане запроса говорится, что существует вложенный цикл, который, как я понимаю, обусловлен состоянием OR. Есть ли чистый и эффективный способ решения этой проблемы? Я использую Redshift.

EDIT: Я пытаюсь запустить это с помощью UNION, но он, похоже, не быстрее, чем раньше.

+0

Вы можете поделиться планом запроса? – greginvm

+0

Убедитесь, что вы используете 'union all' для случаев, когда дубликаты не являются проблемой, так как это намного быстрее. – systemjack

ответ

0

Если у вас есть предпочтительная колонка, вы можете NVL() (aka COALESCE()) их и присоединиться к этому.

SELECT t1.a, t1.b, nvl(t1.c, t2.c), nvl(t1.d, t2.d) 
FROM table1 t1 
JOIN table2 t2 
    ON t1.c = NVL(t2.c,t2.d); 

я также хотел бы предложить, что вы должны установить таблицу поиска для DISTSTYLE ALL, чтобы гарантировать, что больше таблица не перераспределяется.

[Также 10 миллионов строк не являются большими для Redshift. Не пытайтесь быть сопливым, просто говоря, что мы получаем отличную производительность в Redshift даже при запросе (и объединении) таблиц с сотнями миллиардов строк. ]

0

Как насчет того, чтобы сделать два (слева) соединения? С маленькой рабочей таблицей производительность не должна быть слишком плохая.

SELECT t1.a, t1.b, nvl(t1.c, t2.c), nvl(t1.d, t3.d) 
FROM table1 t1 
LEFT JOIN table2 t2 ON t1.d = t2.d and t1.c is null 
LEFT JOIN table2 t3 ON t1.c = t3.c and t1.d is null 

Ваш исходный запрос возвращает только строки, которые соответствуют по крайней мере одному из c или d в таблице поиска. Если это не гарантировано, вам может потребоваться добавить фильтры ... например, строки в t1, где оба c и d являются нулевыми или имеют значения, отсутствующие в таблице2.

Не нужны нулевые проверки в соединениях, но может быть немного быстрее.

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