1

a是一个包含 5,000,000 条记录和一个分数的表。b是一个包含 100,000 条记录和一个(不同)分数的表。我想输出表a中的每条记录,只要同一记录不在表b中且得分等于 1。

我编写的以下查询执行了 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
4

2 回答 2

1

您的查询从表 a 中检索所有记录,这些记录也在表 b 中且得分不等于 1(并且检索这些记录的次数与它们在表 b 中出现的得分不等于 1 的次数一样多)。这不同于“表 a 中的每条记录,只要同一记录不在表 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)
于 2014-09-03T03:54:28.883 回答
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)

您也可以使用 In,但这可能存在性能问题。 http://www.w3resource.com/sql/special-operators/sql_exists.php

于 2014-09-03T04:04:48.690 回答