2010-09-06 58 views
1

這是我的代碼優化代碼:LINQ和foreach循環15K記錄

​​

基本上,從另一臺服務器通過一些方法填補了InstellingGegevens表武功。 然後我需要做的是檢查這個表中是否有新記錄,並在Instellingens中填寫新記錄。

此代碼在15k條記錄上運行時間爲4分鐘。我如何優化它?或者是存儲過程的唯一途徑?

此代碼在計時器中運行,每6小時運行一次。如果一個存儲過程是最好的,如何在計時器中使用它?你可以優化這個

 Timer Tim = new Timer(21600000); //6u 
     Tim.Elapsed += new ElapsedEventHandler(fixInstellingenTabel); 
     Tim.Start(); 

回答

3

在存儲過程中這樣做會快得多。我們做了一些非常相似的事情,表中只有大約10萬個項目,每五分鐘更新一次,並且有更多的領域。我們的工作需要大約兩分鐘的時間才能完成,然後它會在三個數據庫的幾個表中進行更新,因此您的工作只需要幾秒鐘。

你需要將只是像查詢:

create procedure UpdateInstellingens as 

insert into Instellingens (
    INST_LOC_REF, INST_LOCNR, INST_REF, INST_TYPE, Opt_KalStandaard 
) 
select q.INST_LOC_REF, q.INST_LOCNR, q.INST_REF, q.INST_TYPE, cast(0 as bit) 
from InstellingGeven q 
left join Instellingens i 
    on q.INST_LOC_REF = i.INST_LOC_REF and q.INST_LOCNR = i.INST_LOCNR 
    and q.INST_REF = i.INST_REF and q.INST_TYPE = i.INST_TYPE 
where i.INST_LOC_REF is null 

您可以在SQL服務器運行作業的程序,不涉及任何應用程序在所有的,或者您可以使用ADO.NET來執行程序從你的計時器。

+0

這段代碼很棒。它在不到一秒的時間內運行15k條記錄。我想了半秒。驚人的速度:)你能解釋一下這個查詢的工作原理嗎?因爲我不明白它是正確的。是這樣嗎?:插入表格中,從instellinGegevens中選擇4個項目,其中inst_loc_ref爲空。我沒有得到左連接的功能。爲什麼當你加入這兩個表時,它不會給出錯誤,當其中一個表沒有相應的值時。 – Stefanvds 2010-09-06 14:30:18

+0

編輯:好的我得到了左連接。輝煌的想法:)謝謝! http://www.w3schools.com/sql/sql_join_left.asp – Stefanvds 2010-09-06 14:35:55

2

一種方式是通過改變Count(...) <= 0Any()。然而,一個更好的優化將檢索單個查詢此信息外循環:

var instellingens = _db.Instellingens 
    .Select(q => new { q.INST_LOC_REF, q.INST_LOCNR, q.INST_REF, q.INST_TYPE }) 
    .Distinct() 
    .ToDictionary(q => q, q => true); 

(關於第二個想法,一個HashSet是最合適的位置,但不幸的是沒有ToHashSet()擴展方法如果你喜歡,你可以寫你自己的)

然後你的循環中:

if (instellingens.ContainsKey(new { q.INST_LOC_REF, q.INST_LOCNR, 
            q.INST_REF, q.INST_TYPE })) { 
    // There is no item yet. Create one. 
    // ... 
} 

然後,你可以通過使LA優化循環本身zy-retrieve:

// No need for the List<InstellingGegeven> 
foreach (InstellingGegeven i in _db.InstellingGegevens) { 
    // ... 
} 
+0

+1。顯然,Netagitve方面是內存消耗增加。不是真正的負面因素,除非這個因素變得至關重要 - 所以它不會阻止我的+1。 – TomTom 2010-09-06 14:08:42

1

Guffa說了什麼,但如果使用Linq在這裏並不是最好的課程,與其他ORM一樣,Linq犧牲了可用性的性能。對於典型的應用程序執行路徑,這通常是一個很好的折衷。另一方面,SQL非常擅長基於集合的操作,所以真的是在這裏飛行的方式。