Ускорьте объединение с 2 ключами - PullRequest
0 голосов
/ 28 июня 2018

Можно ли как-нибудь ускорить это?

CREATE TABLE TEST AS 
SELECT t1.Tech, t2.Coloar,t2.Car from Table1 t1 
INNER JOIN Table2 t2 on (t1.ID = t2.ID AND t1.IT = t2.IT AND t1.LIFI = t2.LIFI) OR (t1.RA = t2.RA) 
where...

Если я создаю таблицу только с

(t1.ID = t2.ID AND t1.IT = t2.IT AND t1.LIFI = t2.LIFI)

или с этим ключом

(t1.RA = t2.RA) 

это занимает секунды, но обе вместе - пару минут, и у меня есть все больше и больше таблиц для создания, и иногда мне нужно СЛЕДУТЬ, ЧТОБЫ СОЕДИНИТЬ эту пару ключей, как

CREATE TABLE...
INNER JOIN...
LEFT JOIN on (t1.ID = t2.ID AND t1.IT = t2.IT AND t1.LIFI = t2.LIFI) OR (t1.RA = t2.RA)

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

Удалите OR из предложения ON:

CREATE TABLE TEST AS 
    SELECT t1.Tech,
           COALESCE(t2.Color, tt2.Color),
           COLAESCE(t2.Car, tt2.Car)
    FROM Table1 t1 LEFT JOIN
         Table2 t2 
         ON t1.ID = t2.ID AND t1.IT = t2.IT AND t1.LIFI = t2.LIFI LEFT JOIN
         Table2 tt2
         ON t1.RA = tt2.RA AND t2.ID IS NULL
     WHERE (t2.ID IS NOT NULL OR tt2.ID IS NOT NULL) AND
           ...

Это должно быть в состоянии использовать соответствующие индексы для обоих соединений.

0 голосов
/ 28 июня 2018

Попробуйте это

CREATE TABLE TEST AS 
select t1.Tech, t2.Coloar,t2.Car
From Table1  t1
left join Table2 t2 on (case when t1.RA = t2.RA then 1 when t1.ID = t2.ID AND t1.IT = t2.IT AND t1.LIFI = t2.LIFI then 1 else 0 end = 1)
...