すべてを試しましたが、この問題を解決できませんでした。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秒で実行されます。私はすべてのインデックスを作成しましたが、それは助けになりませんでした。道による
My機能:任意の助けをいただければ幸いです
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つのコードサンプルは、異なることを行います。最初のものは、任意の相関パラメータを持っていない2つ目はんが容易に書き換えることができます。おそらく、両方の場合において、関数は、外側の列ごとに呼び出され、2番目のいずれかで 'WHERE'句を持っているように、これはわずかに小さい数です。 –
すみません。私は間違った質問を書いて更新しました。 – emrahyigit