我有2个表,参赛人数超过600万:
表名:ONE
ID Domain Status
------------------
1 xyz 1
2 abc -1
3 fgh 0
状态具有(1,-1,0)值。
表名:TWO
ID Domain level code
-------------------------
60 xyz 0 404
我的目标:为ONE.domain = TWO.domain更新ONE.status,其中TWO.ID = ?, TWO.level =?和TWO.code = ?.
我的查询:
UPDATE ONE
SET status = -1
WHERE domain IN (SELECT domain
FROM TWO
WHERE id = 88
AND level = 0
AND code in (403, 404));
我的问题:
我的问题:是否有其他方式(不同的方法)更有效地执行相同的操作?
编辑1:
ONE.domain具有唯一值,但TWO.domain没有唯一值,所以我不认为我们可以使用JOIN。两个表都被编入索引。
答案 0 :(得分:0)
以下是我将如何做到这一点:
UPDATE
one
SET
one.Status = -1
FROM
one
JOIN
two ON one.Domain = two.Domain
WHERE
two.ID = ? AND two.Level = ? AND two.CODE = ?
与您的尝试不同,它使用明确的JOIN
代替WHERE IN
,除非two.Domain
是唯一的,否则它们会非常不同。
答案 1 :(得分:0)
我建议使用索引。而且,如果表TWO
没有重复项,请使用JOIN
:
UPDATE ONE
SET crawler_status_code = -1
FROM one t1 JOIN
two t2
ON t1.domain = t2.domain
WHERE t2.id = 88 AND t2.level = 0 AND code in (403, 404));
two(id, level, code, domain)
上的索引可能会非常有用。类似的索引应该适用于您的查询版本。
答案 2 :(得分:0)
我不认为重复会破坏连接 试试这个 AND ONE.crawler_status_code!= -1使它更有效率,因为它可以跳过这些行而不是锁定
UPDATE ONE
SET ONE.Status = -1
FROM ONE
JOIN TWO
ON one.Domain = two.Domain
WHERE TWO.id = 88
AND TWO.level = 0
AND TWO.code in (403,404))
AND ONE.Status != -1
答案 3 :(得分:0)
非常感谢回应那些人,你们都很关注,但你们的解决方案并不适合我。这对我有用:
UPDATE ONE t1
JOIN TWO t2 ON t1.domain = t2.domain
SET t1.status = -1
WHERE t2.ID = 88
AND t2.level = 0
AND t2.code IN (403, 404);
我刚刚在SET之前做过JOIN在你们给出的查询中。这个查询需要半秒才能执行,而我的原始版本需要花费几小时。即使我在列中有NULL值,此查询仍然有效。
再次感谢。