Tsql Tracnsact SQL获取性能
嗨,我想制作一个存储过程,它将连接2个表并检查一些要更新的值。 我们将使用FETCH对每条记录进行更新 但我们正在考虑性能。使用FETCH是个坏主意吗 例如: 表1 书呆子 书名 表2 评级 书名 书呆子 我们将这样连接这两个表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
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子句,内部联接;使用
,表2中未与联接匹配但仍由外部联接包含的行将被丢弃,因为它们的BookID将始终为空Table2.BookID=0
- 类似地,将Table1的BookId设置为Table2的BookId将始终将其设置为0,因为where子句表示“where Table2.BookId=0”。你可能想重新考虑这个
- 由于where子句,内部联接;使用
,表2中未与联接匹配但仍由外部联接包含的行将被丢弃,因为它们的BookID将始终为空Table2.BookID=0
- 类似地,将Table1的BookId设置为Table2的BookId将始终将其设置为0,因为where子句表示“where Table2.BookId=0”。你可能想重新考虑这个
- (像往常一样)马丁说的话
另外,根据您的描述,更新的外观如下(对于SQL Server):
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