我需要优化一个运行缓慢的存储过程,该过程使用基于游标的方法进行基于集合的方法。
原则上,我必须将瞬态表(最多300条记录)中的记录与“主表”中的记录进行比较(大约五十万条记录并稳步增长)。通过比较两个记录中的20个varchar(11)列来执行匹配。如果两个记录之间的这些列中至少有6个匹配(即相同的数据)被认为是“足够匹配”并且记录将被创建到存储瞬态记录和主记录的ID的匹配表中,匹配总数和不匹配总数。
请注意,不匹配的数量不等于20的余额减去匹配数。这是因为如果两个记录中的任何一个中的任何列都包含null,则不计入匹配也不计算不匹配;它完全被忽略了。因此需要捕获两个计数(业务要求)。
当前实现对主表使用外部FAST_FORWARD游标,对瞬态表使用内部FAST_FORWARD游标。在内部游标中,它具有应用于20列的以下简单比较逻辑:
IF @newResults.data1 IS NOT NULL AND @results.data1 IS NOT NULL
BEGIN
IF @newResults.data1 = @results.data1
SET @matchCount = @matchCount + 1
ELSE
SET @mismatchCount = @mismatchCount + 1
END
然后,如果匹配列的总数(即@matchCount
)>> 6,则将“匹配记录”写入捕获两个记录的主键和数字的“匹配表”比赛和不匹配。
我希望实现的目标:而不是循环遍历两个嵌套游标并一次处理一条记录,使用基于集合的实现来处理上述内容。我能想到的一个简单的解决方案是做一个:
INSERT INTO MatchingResults (ResultID, NewResultID, matchCount, mismatchCount)
SELECT (...) WHERE (...)
...并将整个匹配的enchilada放在SELECT语句中。但是,这是困难的部分......有人能在这里给我一些指示吗?或者建议性能更好的解决方案?非常感谢!
更新了表格结构:
--
-- Transient table:
--
table NewResults
(
NewResultID int identity(1,1),
Data1 varchar(11),
Data2 varchar(11),
...
Data20 varchar(11),
SampleDate datetime
)
--
-- Master table:
--
table Results
(
ResultID int identity(1,1),
Data1 varchar(11),
Data2 varchar(11),
...
Data20 varchar(11),
SampleDate datetime
)
--
-- Match table:
--
table MatchingResults
(
ResultID int,
NewResultID int,
MatchCount int,
MismatchCount int
)