모든 것을 시도했지만이 문제를 해결할 수 없습니다.SQL Server 테이블 반환 함수는 느린 처리
테이블 값 기능이 있습니다. 제가
SELECT * FROM Ratings o1
CROSS APPLY dbo.FN_RatingSimilarity(50, 497664, 'Cosine') o2
WHERE o1.trackId = 497664
이 함수를 호출 할 때
그것은 실행되는 동안 소요. 그러나 내가 이것을 할 때.
SELECT * FROM Ratings o1
CROSS APPLY dbo.FN_RatingSimilarity(50, o1.trackId, 'Cosine') o2
WHERE o1.trackId = 497664
32 초 후에 실행됩니다. 모든 색인을 만들었지 만 도움이되지 않았습니다. 그런데
내 기능 : 어떤 도움을 주시면 감사하겠습니다
ALTER FUNCTION [dbo].[FN_RatingSimilarity]
(
@trackId INT,
@nTrackId INT,
@measureType VARCHAR(100)
)
RETURNS TABLE
WITH SCHEMABINDING
AS
RETURN
(
SELECT o2.id,
o2.name,
o2.releaseDate,
o2.numberOfRatings,
o2.averageRating,
COUNT(1) as numberOfSharedUsers,
CASE @measureType
WHEN 'Cosine' THEN SUM(o3.score*o4.score)/(0.01+SQRT(SUM(POWER(o3.score,2))) * SQRT(SUM(POWER(o4.score,2))))
WHEN 'AdjustedCosine' THEN SUM((o3.score-o5.averageRating)*(o4.score-o5.averageRating))/(0.01+SQRT(SUM(POWER(o3.score-o5.averageRating, 2)))*SQRT(SUM(POWER(o4.score-o5.averageRating, 2))))
WHEN 'Pearson' THEN SUM((o3.score-o1.averageRating)*(o4.score-o2.averageRating))/(0.01+SQRT(SUM(POWER(o3.score-o1.averageRating, 2)))*SQRT(SUM(POWER(o4.score-o2.averageRating, 2))))
END as similarityRatio
FROM dbo.Tracks o1
INNER JOIN dbo.Tracks o2 ON o2.id != @trackId
INNER JOIN dbo.Ratings o3 ON o3.trackId = o1.id
INNER JOIN dbo.Ratings o4 ON o4.trackId = o2.id AND o4.userId = o3.userId
INNER JOIN dbo.Users o5 ON o5.id = o4.userId
WHERE o1.id = @trackId
AND o2.id = ISNULL(@nTrackId, o2.id)
GROUP BY o2.id,
o2.name,
o2.releaseDate,
o2.numberOfRatings,
o2.averageRating
)
.
감사합니다. Emrah
질문이 무엇인지 확실하지? 당신이 제공하는 2 개의 코드 샘플은 다른 일을합니다. 첫 번째 매개 변수에는 상관 된 매개 변수가없고 쉽게 다시 작성할 수 있지만 두 번째 매개 변수는 쉽게 다시 작성할 수 있습니다. 아마도 두 경우 모두 함수가 외부 행에서 호출되고 두 번째 행에 WHERE 절이 있기 때문에 이것은 더 작은 숫자 일 것입니다. –
죄송합니다. 나는 틀린 질문을 썼다. – emrahyigit