테이블은 calling_party 및 called_party 열로 구성되며 레코드는 호출자 역할을하고 다른 하나는 파티라고하는 두 사용자 간의 연결을 설명합니다.공통 및 모든 이웃을 계산하는 다음 쿼리를 최적화하기위한 제안은 무엇입니까?
동일한 두 명의 사용자가 두 개의 연결을 가질 수 있습니다.이 경우 방향이 변경되면 역할/발신자 역할이 전환됩니다.
원본 테이블 (monthly_connections)에서 일반 및 전체 이웃의 수가 저장되는 common_neighbors 및 total_neighbors 열을 추가했습니다. 이 전화의 공통 이웃과 상대방과 총 6 개 이웃이있다
관찰 된 연결이 경우 : 용어가 일반적인 명확히하고 total_neighbors하기 위해 나는 다음과 같은 이미지를 추가했다. 이 두 값을 얻기 위하여
나는 다음과 같은 저장 프로 시저를 썼다 :
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 초가 걸렸습니다.
실행 시간을 단축하기 위해 위의 절차에 대한 수정 프로그램을 제안한 사람이라면 정말 고맙겠습니다.
감사합니다.