我對SQL和數據庫一般都很陌生。我正在使用SQL Server 2008 Mgmt Studio。TSQL While循環與合併
我讀過使用基於集合的操作比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
示出了32%的FirstAttempt批次和68%SecondAttempt
的PersonWord
表包含大約4100萬條記錄...的Person
表包含 大約17萬
任何想法/建議將是最受歡迎的。感謝您抽出寶貴的時間,我知道newb問題有多令人沮喪(用於對雅虎進行數學幫助)。
編輯::
運行那些PersonWord有大約130萬的記錄和個人有大約3000 ...與合併的版本了〜過1.3秒執行。 while循環的版本是6分鐘,只完成了約15%的工作。
對於這樣的事情,基於集的不是RBAR!
您已經看到了預計的執行計劃並可以獲得實際的執行計劃。你有沒有適合StackOverflow的問題? – HABO
在Sql Server Mgt Studio中,右鍵單擊查詢並選擇'include client statistics',然後運行每個查詢六次左右。您將在輸出中獲得一個額外的選項卡和時間信息。 「批量百分比」對我來說並不是一個有用的指標。 –
@HABO是的,對於那些你知道sql的來龍去脈,比一個while循環更好的合併?我已經在這裏呆了兩天,試圖找到答案只是爲了得到衝突的結果 – sylk