区分大型数据列表的最佳方法,算法和方法是什么?

时间:2009-01-20 15:09:45

标签: c# sql algorithm

我每天都会收到一大堆当前帐号,并将它们存储在数据库中。我的任务是从每个文件中查找添加和释放的帐户。现在,我有4个SQL表,(AccountsCurrent,AccountsNew,AccountsAdded,AccountsRemoved)。当我收到一个文件时,我将它完全添加到AccountsNew。然后运行以下查询以查找我们添加和删除的内容。

INSERT AccountsAdded(AccountNum, Name) SELECT AccountNum, Name FROM AccountsNew WHERE AccountNumber not in (SELECT AccountNum FROM AccountsCurrent)

INSERT AccountsRemoved(AccountNum, Name) SELECT AccountNum, Name FROM AccountsCurrent WHERE AccountNumber not in (SELECT AccountNum FROM AccountsNew)

TRUNCATE TABLE AccountsCurrent

INSERT AccountsCurrent(AccountNum, Name) SELECT AccountNum, Name FROM AccountsNew

TRUNCATE TABLE AccountsNew

现在,我差不多有大约250,000个帐户,但这会继续增长。这是最好的方法吗,你还有其他想法吗?

编辑: 这是一个MSSQL 2000数据库。我正在使用c#来处理文件。

我关注的唯一数据是在最后和当前文件之间添加和删除的帐户。 AccountsCurrent仅用于确定添加或删除的帐户。

5 个答案:

答案 0 :(得分:1)

听起来像历史/审计流程,使用触发器可能会更好。有一个单独的历史记录表来捕获更改(例如,时间戳,操作,执行更改的人等)

新帐户和已删除帐户很容易理解。 “当前”帐户意味着新的和删除之间存在中间状态。我认为“新”和“添加”之间没有任何区别。

我不会有四张桌子。我有一个STATUS表,它具有不同的可能状态,ACCOUNTS或HISTORY表将有一个外键。

答案 1 :(得分:1)

说实话,我认为我会遵循你的方法。有一点是你可以删除truncate,将“new”重命名为“current”并重新创建“new”。

答案 2 :(得分:1)

在长列表中使用IN子句可能会很慢。

如果表被索引,使用LEFT JOIN可以证明更快......

INSERT INTO [table] (
    [fields]
    )
SELECT
    [fields]
FROM
    [table1]
LEFT JOIN
    [table2]
        ON [join condition]
WHERE
    [table2].[id] IS NULL

这假设1:1的关系,而不是1:多。如果你有1:很多你可以做任何... ... 1.选择DISTINCT
2.使用GROUP BY子句
3.使用其他查询,见下文......

INSERT INTO [table] (
    [fields]
    )
SELECT
    [fields]
FROM
    [table1]
WHERE
    EXISTS (SELECT * FROM [table2] WHERE [condition to match tables 1 and 2])

-- # This is quick provided that all fields to match the two tables are
-- # indexed in both tables.  Should then be much faster than the IN clause.

答案 3 :(得分:0)

您还可以减去交集以获取一个表中的差异。

答案 4 :(得分:0)

如果初始文件以合理且一致的方式排序(大IF!),那么它作为一个逻辑上比较文件的C#程序运行速度会快得多。