我已經寫了一塊實驗室處理軟件,需要輸入數據,打破它,並將它發送到數據庫中正確的領域。數據庫表格非常大,並且有很多字段。在插入數據之前,我會在插入數據之前進行一次複製檢查(我們從多個來源獲取重複數據)。如何在插入之前加速複製檢查?
的系統的工作原理是解析傳入數據,填充LINQ到SQL對象。 dupe檢查通過在linq-to-sql對象列表上執行.where操作來選擇尚未在表中的對象。
例如...
input=list (of TableA) 'linq to sql objects
output=input.where(function (x as TableA) not myDb.TableA.any(function(l as table) l.name=x.name, l.dob=x.dob..etc for 10 fields..).tolist
的語法是有點神祕,但是這是我能找到執行上的LINQ to SQL對象和數據庫記錄的內部連接的唯一途徑。在我使用這種方法之前,我一行一行地執行了複製檢查,這種方法速度較慢。
據我瞭解,LINQ的是這個LINQ語句轉換到在服務器上運行的SQL語句。
我的問題是:有沒有辦法得到這個跑得更快?是否有理由期望寫出一條sql語句來執行重複數據刪除和運行傳統查詢會更快?這個陳述很慢,但它的工作原理是,通過單元測試並阻止這些模糊。我在尋找的東西更快,等效乾淨(不硬,我知道)或清潔劑...
儘管不是您的問題的直接答案,但我用於類似(儘管不完全相同)的用例的一種技術是編寫一個存儲過程,它執行相應的創建/更新/忽略決策。這將移動所有的邏輯服務器端,以便只有一個SQL通信(存儲過程調用)由LINQ執行。如果你是網絡綁定的,這將有所幫助。 – SAJ14SAJ
@ SAJ14SAJ我不完全明白。 linq查詢不會被轉換爲傳遞給服務器的單個sql語句嗎?我們正在慢速網絡上運行,所以如果情況並非如此,那麼這可能是阻礙(除了大數據庫) – bernie2436
簡短的答案是:它取決於。在構造DataContext時,您可以通過將'TextWriter'傳遞給'Log'屬性來確切地知道它在做什麼。但是,根據情況,它可能會在提交插入檢查之前自行執行「此行是否需要更新」檢查。您的where子句肯定會執行查詢,然後LINQ將始終爲每個待處理的插入操作執行另一個SQL命令。網上有很多關於「LINQ sql優化」查詢的信息。 – SAJ14SAJ