2014-09-03 2 views
1

a - таблица из 5 000 000 записей и оценка. b - таблица из 100 000 записей и оценка (другая). Я хочу, чтобы вывести все записи из таблицы , пока та же запись не в таблице б со счетом равным 1.Левое наружное соединение на 2 колонках не работает должным образом

Следующий запрос я написал взял 15 часов для выполнения и до сих пор работает , Возможно ли, что это может занять много времени для выполнения такого запроса или, возможно, что-то не так с моим кодом?

SELECT a.c1, a.c2, a.score 
INTO OUTFILE 'file.csv' 
FROM a 
LEFT OUTER JOIN b 
ON a.c1=b.c1 
AND a.c2=b.c2 
WHERE b.score <> 1 

ответ

1

Ваш запрос извлекает все записи из таблицы А, которые также в таблице б со счетом не равны 1 (и он извлекает те записи, как много раз, как они появляются в таблице б со счетом, кроме 1) , Что отличается от «каждой записи из таблицы до тех пор, пока одна и та же запись не находится в таблице b со счетом, равным 1».

SELECT a.c1, a.c2, a.score 
INTO OUTFILE 'file.csv' 
FROM a 
WHERE NOT EXISTS (
    SELECT 1 FROM b 
    WHERE a.c1 = b.c1 
    AND a.c2 = b.c2 
    AND b.score = 1 
) 

Запрос выше, можно воспользоваться следующим индексом

create index my_idx on b(c1,c2,score) 
1

Вы можете достигнуть его по-разному.

SELECT a.c1, a.c2, a.score 
INTO OUTFILE 'file.csv' 
FROM a WHERE NOT EXISTS 
(SELECT * FROM b WHERE a.c1=b.c1 
AND a.c2=b.c2 and b.score = 1) 

ИЛИ

SELECT a.c1, a.c2, a.score 
    INTO OUTFILE 'file.csv' 
    FROM a WHERE NOT EXISTS 
    (SELECT * FROM a INNER JOIN b 
ON a.c1=b.c1 
AND a.c2=b.c2 and b.score =1) 

ДРУГОЙ ПУТЬ

;with t as 
(
SELECT a.c1, a.c2, a.score from a 
), 
u as 
(
select * FROM b where score =1 and b.c2=t.c2 and b.c1 = t.c1 
) 
SELECT t.c1,t.c2,t.score FROm t INTO OUTPUT 'FILe.csv WHERE NOT EXISTS (SELECT * FROM u) 

Вы можете использовать в качестве хорошо, но это может иметь проблемы с производительностью. http://www.w3resource.com/sql/special-operators/sql_exists.php

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