Tsql Tracnsact SQL获取性能

Tsql Tracnsact SQL获取性能,tsql,fetch,Tsql,Fetch,嗨,我想制作一个存储过程,它将连接2个表并检查一些要更新的值。 我们将使用FETCH对每条记录进行更新 但我们正在考虑性能。使用FETCH是个坏主意吗 例如: 表1 书呆子 书名 表2 评级 书名 书呆子 我们将这样连接这两个表 SELECT * FROM Table2 LEFT JOIN Table1 ON Table2.BookName = Table1.BookName WHERE Table2.BookID = 0 对于此查询提取的每条记录,我们将进行更新,将Table1的bookI

嗨,我想制作一个存储过程,它将连接2个表并检查一些要更新的值。 我们将使用FETCH对每条记录进行更新

但我们正在考虑性能。使用FETCH是个坏主意吗

例如:

表1 书呆子 书名

表2 评级 书名 书呆子

我们将这样连接这两个表

SELECT * FROM Table2
LEFT JOIN Table1 ON Table2.BookName = Table1.BookName 
WHERE Table2.BookID = 0
对于此查询提取的每条记录,我们将进行更新,将Table1的bookID设置为Table2的bookID列。

您应该尽量避免使用SQL Server中的游标,而是使用基于集合的替代方法

UPDATE
语句确实支持将
JOIN
s连接到其他表。

您应该尽量避免使用SQL Server中的游标,而是使用基于集合的替代方法

UPDATE
语句确实支持
JOIN
s到其他表。

(像往常一样)Martin所说的

另外,根据您的描述,更新的外观如下(对于SQL Server):

  • 由于where子句,内部联接;使用
    Table2.BookID=0
    ,表2中未与联接匹配但仍由外部联接包含的行将被丢弃,因为它们的BookID将始终为空
  • 类似地,将Table1的BookId设置为Table2的BookId将始终将其设置为0,因为where子句表示“where Table2.BookId=0”。你可能想重新考虑这个
    • (像往常一样)马丁说的话

      另外,根据您的描述,更新的外观如下(对于SQL Server):

      • 由于where子句,内部联接;使用
        Table2.BookID=0
        ,表2中未与联接匹配但仍由外部联接包含的行将被丢弃,因为它们的BookID将始终为空
      • 类似地,将Table1的BookId设置为Table2的BookId将始终将其设置为0,因为where子句表示“where Table2.BookId=0”。你可能想重新考虑这个

      是否通过光标获取?如果是这样,那么这通常不是一种有效的方法,您需要提供更多详细信息。@Alex yes通过光标获取。我还更新了我的问题。您说“我们将进行更新,将Table1的bookID设置为Table2的bookID列。”您确定您的
      WHERE
      条件正确吗?您不应该检查
      WHERE Table1.bookID=0
      ?在这里使用
      OUTER
      连接也没有意义,我认为您只对两个表中匹配的行感兴趣?是的,我们将只更新两个表中匹配的行,并且我们不会检查
      WHERE Table1.BookID=0
      通过游标获取?如果是这样,那么这通常不是一种有效的方法,您需要提供更多详细信息。@Alex yes通过光标获取。我还更新了我的问题。您说“我们将进行更新,将Table1的bookID设置为Table2的bookID列。”您确定您的
      WHERE
      条件正确吗?您不应该检查
      WHERE Table1.bookID=0
      ?在这里使用
      OUTER
      join也没有意义,因为您只对两个表中匹配的行感兴趣?是的,我们将只更新两个表中匹配的行,我们不会检查
      其中Table1.BookID=0
      对大型表的更新有时会导致表锁,这会影响用户。要解决这个问题,您可以使用光标以较小的批处理查询。@McMinton-最好使用包含
      TOP(@batchsize)
      的CTE,然后更新CTE IMO。对大型表的更新有时会导致表锁定,这将影响用户。要解决这个问题,您可以使用光标以较小的批处理查询。@McMinton-最好使用包含
      TOP(@batchsize)
      的CTE,然后更新CTE IMO.No。我们将把Table1的BookID设置为Table2的BookID列,这样它就不会总是0。但是现在我更喜欢不使用光标的更新命令,谢谢。我们将把Table1的BookID设置为Table2的BookID列,这样它就不会总是0。但是现在我更喜欢不使用游标的update命令,谢谢。
      UPDATE Table1
       set BookID = t2.BookID
       from Table1 t1
        inner join Table2 t2
         on t2.BookName = t1.BookName
       where T2.BookID = 0