插入我有兩個表,看起來像這樣:有效的一種一對多的C#和MSSQL
News: (ID, Title, TagID)
Tags: (ID, Tag)
每個消息只能有一個標籤。處理插入新聞表的最有效方法是什麼?標籤表具有50 000行。
我只做了大約一半的插入。 300條新聞,每小時約2次。我認爲我需要一些內存中的標籤緩存?
如果標籤不在標籤表中,我需要插入它並將TagID設置爲新插入的標識。
希望你能明白!
插入我有兩個表,看起來像這樣:有效的一種一對多的C#和MSSQL
News: (ID, Title, TagID)
Tags: (ID, Tag)
每個消息只能有一個標籤。處理插入新聞表的最有效方法是什麼?標籤表具有50 000行。
我只做了大約一半的插入。 300條新聞,每小時約2次。我認爲我需要一些內存中的標籤緩存?
如果標籤不在標籤表中,我需要插入它並將TagID設置爲新插入的標識。
希望你能明白!
我每條新聞相信你會得到一個字符串列表屬於所謂的「標籤」。從你提供的結構來看,每個新聞項目只能有一個標籤?這看起來很不尋常,但無論如何,下面都適用。
如果您的標籤表上有一個索引,搜索將會非常快,並且數據庫將負責緩存,所以不要擔心緩存。當你在正確的位置有索引時,你會驚訝地發現數據庫可以加速多少東西
從Tag = whatever1(對每個標籤都這樣做)中進行選擇,每次如果沒有返回行插入它,否則使用你發現的id來做到這一點。在每個INSERT上運行proc。
您在後臺使用的SQL Server版本是什麼?
如果您使用的是SQL Server 2008,我會建議將每天的標籤和新聞批量加載到臨時工作表中,然後使用MERGE語句從這些工作表中更新實際的標籤和新聞表。我會爲此使用C#「SqlBulkCopy」類。
MERGE允許您輕鬆地只插入那些已更改的項目,並且可能會將那些已存在的項目全部更新到一個簡單的SQL語句中。
如果您使用的是SQL Server 2005或更低版本,則基本上可以做同樣的事情,但是您必須編寫一些代碼(C#或T-SQL)來手動檢查需要從臨時bulkload中插入的內容表格和已經存在的內容。
馬克
謝謝,我測試過這個,它的效果很好。 – alexn 2009-04-17 06:51:24