該表由call_party和called_party列組成,記錄描述兩個用戶之間的連接,其中一個扮演主叫方角色,另一個扮演主叫方角色。任何有關優化以下查詢的建議,這些查詢包括普通和所有鄰居?
相同的兩個用戶可以有兩個連接 - 在這種情況下,當方向改變時,角色主叫/被叫方被切換。
在原始表(monthly_connections)中,我添加了common_neighbors和total_neighbors的附加列,其中存儲了常見鄰居和總鄰居的數量。爲了澄清,術語共同和total_neighbors添加以下圖像:
在這種情況下所觀察到的連接有主叫的2個共同鄰居和被叫方6個總鄰居。
爲了得到這兩個值我寫了下面的存儲過程:
CREATE PROCEDURE [dbo].[spCountNeighbors]
AS
Declare
@CallingParty varchar(50),
@CalledParty varchar(50),
@RecordsUpdated int
SET @CallingParty ='a'
SET @RecordsUpdated = 0
PRINT GETDATE()
WHILE @CallingParty IS NOT NULL BEGIN
SET @CallingParty = NULL
SELECT TOP 1 @CallingParty = calling_party, @CalledParty = called_party FROM monthly_connections WHERE common_neighbors IS NULL
--PRINT @CallingParty
IF @CallingParty IS NOT NULL BEGIN
WITH callingPartyNeighbors AS
(
SELECT called_party as neighbor FROM monthly_connections WHERE calling_party = @CallingParty
UNION
SELECT calling_party as neighbor FROM monthly_connections WHERE called_party = @CallingParty
),
calledPartyNeighbors AS
(
SELECT calling_party as neighbor FROM monthly_connections WHERE called_party = @CalledParty
UNION
SELECT called_party as neighbor FROM monthly_connections WHERE calling_party = @CalledParty
)
UPDATE mc SET common_neighbors = (SELECT COUNT (*) FROM
(
SELECT neighbor FROM callingPartyNeighbors
INTERSECT
SELECT neighbor FROM calledPartyNeighbors
)
t1
),
total_neighbors = (SELECT COUNT (*) FROM
(
SELECT neighbor FROM callingPartyNeighbors
UNION
SELECT neighbor FROM calledPartyNeighbors
)
t2
)
FROM monthly_connections mc WHERE (mc.calling_party = @CallingParty AND mc.called_party = @CalledParty) OR (mc.called_party = @CallingParty AND mc.calling_party = @CalledParty);
SET @RecordsUpdated = @RecordsUpdated + @@ROWCOUNT
PRINT @RecordsUpdated
END
END
PRINT @RecordsUpdated
的程序上面應該去通過連接其中包含的每一行23M的連接和更新值common_neighbors和total_neighbors表。然而,問題在於程序太慢 - 更新1000條記錄需要212秒。
爲了加快執行時間,我真的很感謝你們中的任何人提出了上述過程的任何修正。
謝謝!