一般来说,我对 SQL 和数据库很陌生。我正在使用 SQL Server 2008 Mgmt Studio。
我读过使用基于集合的操作比 RBAR 更好(今天才知道!)。
很快,我将向您展示两个等效的(我认为)查询,并且我正在尝试查看哪个更有效。
第一次尝试:
DECLARE @persID int
DECLARE @mag float
DECLARE @temp TABLE (pID int PRIMARY KEY)
INSERT INTO @temp
SELECT persID FROM Person
WHILE (SELECT COUNT(pID) FROM @temp) > 0
BEGIN
SELECT TOP 1 @persID = pID FROM @temp
SELECT @mag = SQRT(SUM(value*value)) FROM PersonWord
WHERE PersonWord.persID = @persID
UPDATE Person
SET magnitude = @mag
WHERE persID = @persID
DELETE @temp WHERE pID = @persID
END
第二次尝试:
DECLARE @temp TABLE (pID int PRIMARY KEY, mag float)
INSERT INTO @temp
SELECT persID, SQRT(SUM(value*value)) FROM PersonWord
GROUP BY persID
MERGE INTO Person AS p
USING @temp AS t
ON p.persID = t.pID
WHEN MATCHED
THEN UPDATE
SET magnitude = t.mag
这些在运行时保存为存储过程和估计的执行计划:
exec FirstAttempt
exec SecondAttempt
显示 FirstAttempt 批次的 32% 和 SecondAttempt 的 68%
该PersonWord
表包含大约 4100 万条记录...该Person
表包含大约 170,000条记录
任何想法/建议都将受到欢迎。感谢您抽出宝贵的时间,我知道新手问题是多么令人沮丧(用于在 Yahoo 上做数学帮助)。
编辑::
在拥有大约 130 万条记录的 PersonWord 和拥有大约 3000 条记录的 PersonWord 上运行那些......具有合并的版本大约需要 1.3 秒才能执行。带有 while 循环的版本用时 6 分钟,只完成了约 15% 的工作。
对于这种事情,基于集合而不是 RBAR!