2011-01-27 25 views
0

我需要檢查一個特定的數據是否存在於數據庫中的table1中,或不在for循環中。如果它存在,則不會執行任何操作並繼續循環,否則我應該將數據添加到table1。在循環中檢查數據庫中數據存在的最佳實踐?

所以,在每次迭代中,我看看數據庫。我相信這是很耗時間的。

是否有這樣做這些任務的任何最佳做法?

回答

1

如何驗證數據庫表中記錄的存在性?最有可能的是你將它與本地Id或其他內容相匹配。

如果這是真的,那麼我會查詢表並選擇所有Id,將它們存儲在Hashtable(Dictionary in .Net)中。 (如果您的數據庫包含數百萬條記錄,這可能不實際)。確定表中的記錄現在是否存在只是檢查Dictionary中是否存在鍵的簡單事情,這是O(log n)操作,因此比O(n)昂貴的數據庫往返式要好得多。

想想接下來的事情是如何記住你需要添加到表中的記錄。這取決於您是否在本地有重複記錄,您想要檢查是否應該添加它們,或者如果它們保證不包含(本地)重複項。

在沒有可能重複的簡單情況下,只需將它們添加到字典中相應的鍵,然後再查詢Dictionary.Values即O(1)可能是最快的。如果因爲數量巨大而需要插入的速度非常快,請考慮使用SQL Bulk Inserts。

如果您的表太大,無法在本地緩存標識的,我會考慮實施一個存儲過程做的插入和具有決定是否實際執行插入或剛做什麼也沒有邏輯。這將擺脫第二次往返,通常非常昂貴。

如果您的RDBMS實現SQL Merge命令(假設您使用MS SQL Server,它會),我會將所有數據插入臨時表中,然後將其與目標表合併。這可能是最快的解決方案。

+0

這是一個很好的解決方案,但如果有超過3000條記錄table1中? – odiseh 2011-01-27 08:13:43

0

多少數據,什麼SQL實現可以在這裏做一個很大的區別...

例如,有10萬行的數據,使得千萬(潛在記錄)操作,每行一個將採取大於數量級的定單比例如:

  • 上傳相同的數據到批量操作的臨時表通過批量複製API,如果您使用的是SQL。
  • 執行左外聯接到diff的數據
  • 插入在單批操作的差異。