该表由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秒。
为了加快执行时间,我真的很感谢你们中的任何人提出了上述过程的任何修正。
谢谢!