【问题标题】:Delete consecutive duplicates: "File sharing lock count exceeded" at 9k of 1m records删除连续重复:“超过文件共享锁定计数”在 9k 的 1m 记录
【发布时间】:2018-09-01 12:53:13
【问题描述】:

我需要从一个大表中删除连续重复的记录(它可能包含 200k-100 万条记录,大约 一半的记录将被删除)。 p>

DateTime 是独一无二的。其余字段与先前记录匹配的记录应删除,留下“第一条”记录。 (不连续的重复应该保留。)

       DateTime        Field1   Field2   Field3  
 -------------------- -------- -------- -------- 
  2018-09-01 5:20:33      123      456      789  
  2018-09-01 5:20:34      123      456      789        ← delete
  2018-09-01 5:20:35      123      654      987  
  2018-09-01 5:20:36      234      567      890  
  2018-09-01 5:20:37      234      567      890        ← delete 
  2018-09-01 5:20:38      234      567      890        ← delete 
  2018-09-01 5:20:39      123      456      789                     

我正在遍历记录集(按日期排序)以删除重复项,但是当我删除大约 9,500 次时,我得到:

Error 3052: File sharing lock count exceeded.  
            Increase MaxLocksPerFile registry entry.

根据these instructions,我可以增加注册表中的值,或者使用SetOption 方法,但是我不清楚这样做的影响,因为看起来我' d 需要将值从9,500 增加到至少500,000 或更多...我不确定,但这似乎是个坏主意。


我的代码的简化版:

Sub example_DelDupes()
    Dim rs As Recordset, delCount As Long, rCount as long
    Dim thisRecord As String, prevRecord As String
    Set rs = CurrentDb.OpenRecordset("select * from myTable order by DateTime")
    With rs
        .MoveLast            'so I can get a recordcount...
        .MoveFirst
        rCount = .RecordCount '...required for progress bar (not shown)

        Do While Not .EOF
            thisRecord = !field1$ & !field2$ & !field3$ 'actually 
            If thisRecord = prevRecord Then
                .Delete                      'delete this record
                delCount = delCount + 1
            Else
                prevRecord = thisRecord
            End If
            .MoveNext
        Loop

        .Close
    End With
    Set rs = Nothing
End Sub

我认为从我正在迭代的集合中删除可能是问题所在,所以我也尝试标记要删除的记录,而不是 .Delete,以便在循环完成,但编辑产生与删除相同的错误。


我怀疑可能有更好的方法来完成我的任务,可能是使用different LockTypeEnum 打开记录集,或者完全采用不同的方法,但我希望避免反复试验。

想法?谢谢!

【问题讨论】:

  • 你最终解决了这个问题吗?我正在处理类似的事情。

标签: vba database ms-access duplicates file-locking


【解决方案1】:

我会在单个查询中删除所有内容,而不是遍历记录集。

您可以使用嵌套子查询来测试之前的行是否满足您的条件:

DELETE o.*
FROM MyTable o
WHERE EXISTS(
    SELECT 1 
    FROM MyTable i 
    WHERE o.Field1 = i.Field1 And o.Field2 = i.Field2 AND o.Field3 = i.Field3 
    AND EXISTS (
        SELECT  1
        FROM MyTable i2 
        WHERE i2.DateTime < o.DateTime
        HAVING Max(i2.DateTime) = i.DateTime
    )
)

【讨论】:

  • 很好的答案,谢谢。不幸的是,我的数据集的庞大规模似乎是个问题。但是,这在更合理大小的集合上效果很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-25
  • 2012-01-06
  • 1970-01-01
相关资源
最近更新 更多