此過程需要10k行左右的分鐘。如何使用Levenstein算法優化SQL Server存儲過程?
如何讓它更快?
CREATE TABLE #TempTable
(
idl int,
idr int,
prof decimal(10,2),
sportkind nvarchar(50),
eventtype nvarchar(100),
eventname nvarchar(100),
eventdate datetime,
iscorridore bit
)
INSERT INTO #TempTable
SELECT
l.Id, r.Id,
(100.0/(1.0/l.CoeffValue + 1.0/r.CoeffValue) - 100.0),
r.SportKind, r.CoeffType, r.Team1 + '-' + r.Team2, r.EventDate,
dbo.CheckForCorridor(l.CoeffParam, l.CoeffKind, r.CoeffParam, r.CoeffKind)
FROM
Lines l, Lines r
WHERE
--l.BookmakerName != r.BookmakerName AND
l.EventDate = r.EventDate
AND l.SportKind = r.SportKind
AND (l.CoeffType = r.CoeffType OR (l.CoeffType is null AND r.CoeffType is null))
AND dbo.CheckForFork(l.CoeffValue, r.CoeffValue) = 1
AND ((dbo.Levenstein(l.Team1, r.Team1) > 0.8
AND dbo.Levenstein(l.Team2, r.Team2) > 0.8)
OR (dbo.Levenstein(l.Team1, r.Team2) < 0.3
OR dbo.Levenstein(l.Team2, r.Team1) < 0.3)
)
AND dbo.CheckSimpleCoeff(l.CoeffParam, l.CoeffKind, r.CoeffParam, r.CoeffKind) = 1
INSERT INTO Forks (Name, Profit, EventDate, [Event], SportKind, EventType, LeftLine_Id, RightLine_Id, IsCorridore)
--поменять eventname
SELECT
eventname, prof, eventdate, eventname, sportkind, eventtype,
idl, idr, iscorridore
FROM
#TempTable temp
WHERE
NOT EXISTS (SELECT * FROM Forks c
WHERE temp.idl = c.LeftLine_Id
AND temp.idr = c.RightLine_Id)
DROP TABLE #TempTable
END
Levenstein是來自Simmetrics的CLR功能。
我嘗試找到一對符合上述過程規則的行,然後創建新條目並將它們寫入另一個表。
[不良習慣踢:使用舊式JOIN](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style- joins.aspx) - 在ANSI - ** 92 ** SQL標準中**舊式*逗號分隔的表*樣式列表已替換爲* proper * ANSI'JOIN'語法(**超過20年**之前),並且不鼓勵使用它 – 2015-04-03 11:34:06
一個爲什麼你甚至在你不打算使用的行上計算Levenstein。最後你還沒有存在。 – Paparazzi 2015-04-03 12:22:34