繁体   English   中英

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

[英]What is the best way, algorithm, method to difference large lists of data?

我每天都会收到大量当前帐号的清单,并将它们存储在数据库中。 我的任务是从每个文件中查找已添加和已发布的帐户。 现在,我有4个SQL表(AccountsCurrent,AccountsNew,Account☎联系人,Accounts已删除)。 收到文件后,我便将其完全添加到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,仅用于确定添加或删除了哪些帐户。

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

新帐户和已删除帐户很容易理解。 “当前”帐户表示在新建和删除之间存在中间状态。 我看不到“新”和“添加”之间的任何区别。

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

老实说,我认为我会遵循类似您的方法。 一件事是您可以删除截断,将“新”重命名为“当前”,然后重新创建“新”。

在长列表上使用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.选择地区
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.

您也可以减去交点以得到一张表中的差异。

如果以合理且一致的方式订购初始文件(大IF!),则作为逻辑比较文件的C#程序,其运行速度将大大提高。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM