SQL Server 2008:更新查询不起作用,并且没有错误

时间:2016-07-18 16:36:58

标签: sql sql-server-2008 sql-update

我有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));

我的问题:

  • 此查询不会抛出任何错误。
  • 执行开始,它永远不会结束。
  • 单独运行子查询并将结果提供给主查询在5秒内完成。
  • 我尝试分析查询,并在比较域时花费太长时间。

我的问题:是否有其他方式(不同的方法)更有效地执行相同的操作?

编辑1:

ONE.domain具有唯一值,但TWO.domain没有唯一值,所以我不认为我们可以使用JOIN。两个表都被编入索引。

4 个答案:

答案 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值,此查询仍然有效。

再次感谢。