簡體   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