【问题标题】:SQL update using join impacting performance使用连接影响性能的 SQL 更新
【发布时间】:2016-02-04 20:24:49
【问题描述】:

请帮助我调整下面提到的更新语句,

  UPDATE t_cust
  SET cust_name = td.cust_name,
      cust_desc = td.cust_desc
  FROM t_cust tc
  JOIN t_data_cust td ON tc.cust_nr = td.cust_nr
  AND tc.start_validity_date = ISNULL(@execution_date,td.start_validity_date)
  AND (td.adj_id = @adj_id OR @adj_id IS NULL)
  AND ( td.ln_status = '0')
  WHERE td.cust_name            <> tc.cust_name
    OR td.cust_desc             <> tc.cust_desc

【问题讨论】:

  • 你的问题是什么?你是如何识别查询导致性能问题的?还查询包含一些语法错误
  • 请忽略]语法实际上我正在寻找 AND (td.adj_id = (@)adj_id OR (@)adj_id IS NULL) OR 条件我的客户表有数百万条记录并且有触发器以及历史更新
  • 更新需要多少时间?执行此查询的持续时间是多少?
  • 您可以像这样更改联接 JOIN (select * from t_data_cust where tc.start_validity_date = ISNULL((at)execution_date,d.start_validity_date) AND (td.adj_id = (@)adj_id OR (@ )adj_id IS NULL) AND (td.ln_status = '0') ) td ON tc.cust_nr = td.cust_nr WHERE td.cust_name tc.cust_name OR td.cust_desc tc.cust_desc ---如果你的问题是 OR 条件然后写两个更新一个是第一个或第二个是第二个,但我认为这是更好的方法
  • 发布查询计划。更改为选择并确定花费时间的是选择部分还是更新部分

标签: sql-server performance join


【解决方案1】:

WHERE 语句移动到JOIN 条件中。

否则它应该运行良好,如果仍然没有,请提供更多信息。

【讨论】:

  • 请解释否决票? OP 要求调整,这就是我提供的。
  • 如果是外连接,将 where 条件移动到连接中会产生功能差异,但不太可能产生性能差异。它可能不会导致查询计划发生变化。 sql server 足够聪明,可以决定是在连接中应用谓词还是在搜索中更早应用谓词
  • 它是一个 JOIN,而不是一个 OUTER JOIN,所以这是静音的。 “不太可能”和“可能”,不是你争论的理由,你在他的环境中测试过吗?我发现很多情况都是这样提高性能的,主要是逻辑处理顺序。感谢您有不同的看法,但我对答案的建议与任何建议一样有效。
  • 我认为你的意思是没有实际意义的。但不管你是在宣传一个性能神话。逻辑处理顺序在查询计划中,将事物从那里移动到连接不会改变计划。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-04
  • 2021-08-15
  • 1970-01-01
  • 2017-10-10
  • 2013-12-01
  • 1970-01-01
相关资源
最近更新 更多