【问题标题】:correlated delete performance problems相关删除性能问题
【发布时间】:2018-11-29 17:39:16
【问题描述】:

在我的 Access 数据库中(在 C# 应用程序中),我最初有这个查询:

DELETE 
FROM ModelRule 
WHERE RuleID NOT IN (SELECT RuleID FROM Rule)

使用 700K 规则,这速度慢得令人无法忍受。所以我求助于 C# 循环:

foreach ( DataRow row in dtRulesToPurge.Rows ) {
    [pseudocode:] "DELETE FROM ModelRule WHERE RuleID = " + row["ID"];
    [pseudocode:] Give user feedback/progressbar/counts
}

foreach 似乎更快,但主要是(至少)我可以通过进度条给用户反馈。这种方法需要几分钟。相关子查询需要至少几分钟,但我总是在它真正完成之前放弃并杀死它 - 我怀疑它需要更长的时间。

但我心里有点痒,说可能有一种快速的方法可以通过更好的子查询或某种连接等来执行这些删除,这将比我上面的两种方法中的任何一种都好得多。

很想听听你的想法。

【问题讨论】:

标签: c# sql ms-access


【解决方案1】:

我更喜欢NOT EXISTS,所以我会写:

DELETE FROM ModelRule 
WHERE NOT EXISTS (SELECT 1
                  FROM Rule
                  WHERE ModelRule.RuleID  = RULE.RuleID
                 );

然后为了性能,您需要在RULE(RuleID) 上建立索引。

【讨论】:

    猜你喜欢
    • 2011-06-17
    • 2017-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多