2013-05-14 183 views
1

我對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!

+0

您已經看到了預計的執行計劃並可以獲得實際的執行計劃。你有沒有適合StackOverflow的問題? – HABO

+0

在Sql Server Mgt Studio中,右鍵單擊查詢並選擇'include client statistics',然後運行每個查詢六次左右。您將在輸出中獲得一個額外的選項卡和時間信息。 「批量百分比」對我來說並不是一個有用的指標。 –

+0

@HABO是的,對於那些你知道sql的來龍去脈,比一個while循環更好的合併?我已經在這裏呆了兩天,試圖找到答案只是爲了得到衝突的結果 – sylk

回答

3

切勿爲該記錄數使用表變量。它們用於小數據集。改用臨時表並索引它。另外,我會親自尋找一種方法來限制您正在更新的記錄數量。我不確定你爲什麼使用合併,因爲這是一個簡單的更新。下面的代碼應該可以工作。

Update P 
set SET magnitude = t.mag 
from Person AS p 
join #temp AS t 
    ON p.persID = t.pID 
WHERE magnitude <> t.mag 

,並根據你如何往往你要做到這一點,我會嘗試存儲這個計算,因此只需要爲每個記錄發生一次(和使用rtigger保持更新,如果值的變化): SQRT(SUM(value * value))

順便說一句,這是一個不好的做法,浮動任何數學計算ars你會介紹舍入誤差,因爲它不是確切的。

+0

感謝HLGEM,我更改爲使用這些臨時表。這個和其他類似的程序不會經常使用,每年可能會有4次。而且,mag的確切值不是必需的,即使在10^-6時舍入也不會影響mag值的目的。我使用合併,因爲我讀它基本上是更新...從,但我更喜歡你的解決方案,因爲我更清楚地看到發生了什麼。 – sylk

+0

MERGE是「Upsert」的TSQL字。也就是說,「當你有一場比賽時要做什麼」以及「當你沒有比賽時要做什麼」(在來源或目的地)。如果你知道你會有「匹配」,使用更新(如已經建議)。 – granadaCoder

+0

http://en.wikipedia.org/wiki/Merge_(SQL) – granadaCoder