优化超过30秒执行时间的更新查询

时间:2015-08-19 10:32:54

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

我编写了一个程序,在不存在的情况下将数据添加到数据库(重复)。如果数据重复,则数据库中的空字段将被更新。

例如:第一次进入

   js.executeScript("mobile: scrollTo", scrollObject);

现在,如果条目第二次带来一些额外的数据,那么

 companyname  email_id     contact_name  designation  mobile fax country 

1  abc        xyz@abc.com     xyz          pqr          

现在,现有数据仅针对空白字段进行更新,即仅在现有数据中更新移动传真和国家/地区。

现在我的更新查询如下:

2  abc       xyz@abc.com     xyz          pqr      0987765  087722   South Africa

有时我会收到一条错误,上面写着“无法添加Timeout过期。在操作完成之前已超时或服务器没有响应”并通过sql profiler我知道上述查询的持续时间超过30秒。 此查询的执行时间超过30秒。如何优化查询,使执行时间少于30秒。

*注意上述查询是程序的一部分

2 个答案:

答案 0 :(得分:0)

尝试使用merge声明

MERGE INTO yourtable AS Target
USING (VALUES ('abc',
      'xyz@abc.com',
      'xyz',
      'pqr',
      0987765,
      087722,
      'South Africa')) AS Source (companyname, email_id, contact_name, designation, mobile, fax, country )
ON Target.companyname = Source.companyname
   AND Target.email_id = Source.email_id
   AND Target.contact_name = Source.contact_name
   AND Target.designation = Source.designation
WHEN MATCHED THEN
  UPDATE SET companyname = CASE WHEN target.companyname IS NULL OR target.companyname = '' THEN Source.companyname ELSE target.companyname END,
             email_id = CASE WHEN target.email_id IS NULL OR target.email_id = '' THEN Source.email_id ELSE target.email_id END,
             contact_name = CASE WHEN target.contact_name IS NULL OR target.contact_name = '' THEN Source.contact_name ELSE target.contact_name END,
             designation = CASE WHEN target.designation IS NULL OR target.designation = '' THEN Source.designation ELSE target.designation END,
             mobile = CASE WHEN target.mobile IS NULL OR target.mobile = '' THEN Source.designation ELSE target.mobile END,
             fax = CASE WHEN target.fax IS NULL OR target.fax = '' THEN Source.fax ELSE target.fax END,
             country = CASE WHEN target.country IS NULL OR target.country = '' THEN Source.country ELSE target.country END
WHEN NOT MATCHED BY TARGET THEN
  INSERT (companyname,
          email_id,
          contact_name,
          designation,
          mobile,
          fax,
          country )
  VALUES (companyname,
          email_id,
          contact_name,
          designation,
          mobile,
          fax,
          country ); 

注意:根据您的要求修改加入ON条件

答案 1 :(得分:0)

好吧,这个查询似乎没有什么本质上的错误可以解释为什么这么长时间。我会查看查询计划,看看它在做什么。 我还会考虑缩进(为了便于阅读)并改进子查询(因为它看起来过于复杂)