基于游标的方法与基于集合的方法

时间:2018-04-18 09:23:01

标签: sql-server

我需要优化一个运行缓慢的存储过程,该过程使用基于游标的方法进行基于集合的方法。

原则上,我必须将瞬态表(最多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
)

0 个答案:

没有答案