2009-08-04 135 views
1

對於我的代碼,您是否有任何建議可以提高性能?這是.NET 2.0框架,並且DataTable被綁定到DataGridview。數據通過.ReadXML()加載到數據表中,它不是來自數據庫。可以有任何地方從80到100K的記錄。 Terms()數組是用戶通過搜索的內容。所以「鮑勃塔科」將是術語(0)=「鮑勃」,條款(1)=「塔科」。我有一個正則表達式來維護任何引用的條款。所以「鮑勃炸玉米餅」將在陣列的一個元素。有沒有更好的辦法?我嘗試使用Dataview,因爲它具有更好的性能,但它看起來不像我可以使用LIKE運算符。歡迎任何建議,我真的想加快這一點。將Datatable綁定到Datagridview

Public Function Search(ByVal Terms() As String, ByRef ResidentTBL As DataTable) As DataTable 
     'Dim t As Long = Now.Ticks 

     Dim j As Integer 
     Dim newdt As New DataTable("Users") 
     Dim newtable As New DataTable 
     newtable = ResidentTBL.Clone 

     Dim termsceiling As Integer 
     termsceiling = Terms.GetUpperBound(0) 
     Dim filterstr As String = String.Empty 
     Dim foundrows() As DataRow 
     Dim sortOrder As String = "displayname ASC" 
     Dim tempstr As String 

     For j = 0 To termsceiling 
      'remedy any invalid sql characters 
      tempstr = Terms(j).Trim.ToUpper 
      tempstr = tempstr.Replace("'", "''") 
      tempstr = tempstr.Replace("*", "") 
      tempstr = tempstr.Replace("%", "") 

      'assemble the sql query 

      filterstr = filterstr & _ 
     "((column1 LIKE '" & tempstr & "%') OR " & _ 
     "(column2 LIKE '" & tempstr & "%') OR " & _ 
     "(column3 LIKE '" & tempstr & "%') OR " & _ 
     "(column4 LIKE '" & tempstr & "%') OR " & _ 
     "(column5 LIKE '" & tempstr & "%') OR " & _ 
     "(column6 LIKE '" & tempstr & "%') OR " & _ 
     "(column7 LIKE '" & tempstr & "%') OR " & _ 
     "(column8 LIKE '" & tempstr & "%') OR " & _ 
     "(column9 LIKE '" & tempstr & "%') OR " & _ 
     "(column10 LIKE '" & tempstr & "%'))" 


      'if there are further iterations append an AND (user typed more than one term) 
      If termsceiling > 0 And j <> termsceiling Then 
       filterstr = filterstr & " AND " 
      End If 
     Next j 

     filterstr = "(" & filterstr & ")" 'wrap the entire query 

     foundrows = ResidentTBL.Select(filterstr, sortOrder) 

     For i = 0 To foundrows.Length - 1 
      newtable.ImportRow(foundrows(i)) 
     Next i 

     newdt = newtable 

     'Begin Debugging Code: 
     't = Now.Ticks - t 
     'MessageBox.Show("Took " & (t/10000000) & " seconds.") 
     'End Debugging Code: 

     Return newdt 
    End Function 
+1

順便說一句:如果術語是一維數組,您可以使用術語變量的Lenght屬性insead。 – smok1 2009-08-04 14:35:50

回答

0

我會在兩個帳戶上做不同的操作:首先,我將在數據庫上運行查詢,並使用正確的(過濾的)數據填充數據表。其次,這種使用LIKE的方式會每次遍歷所有的記錄,如果你有很多用戶,它會變得很慢。我在這種情況下最終要做的是實現一個「窮人搜索引擎」,它基本上將這些字段中的每個文本解析爲單詞,並在另一個表中插入每個具有相應用戶ID的單詞。該表可以編入索引,搜索將直接使用'='而不是'LIKE'使其更快。

編輯:沒有數據庫會使事情複雜化。特別是因爲你有很多數據,而且我不知道在搜索時是否有索引或優化。如果您有一種在請求之間緩存數據表的方法,則可以使用解析的數據構建另一個數據表。只要用戶搜索相同類型的令牌,它應該可以工作,但爲了找到「bob taco」作爲兩個單詞相鄰,您需要在解析數據和搜索時保存單詞的位置因此(這使得它更復雜一點)。

例如:

ID, Text 
1, Hangs out at Bob Taco joint 
2, Hates Bob and his taco 

會看到這樣的:

ID, Key, Pos 
1, Hangs, 1 
1, out, 2 
1, at, 3 
1, Bob, 4 
1, Taco, 5 
1, joint, 6 
2, Hates, 1 
2, Bob, 2 
2, and, 3 
2, his, 4 
2, taco, 5 

所以,現在你需要搜索包含Bob和炸玉米餅和差異ID之間,他們的POS值應是1.例如,由於Pos是2和5,因此不應找到ID 2。

我在SQL中使用臨時表執行此操作。如果你只需要在內存中工作,它可能會變得更難。

+0

謝謝你的迴應。不幸的是沒有數據庫,這是從XML文件中吸收的。我使用.readxml將其吸入到數據表中。然後我相應地過濾它。我使用LIKE的原因是我不知道用戶會傳給我什麼。這是一個自由浮動的文本搜索。所以他們可以輸入電話號碼,用戶名或名字。我不知道他們將要投入什麼。你的「窮人搜索」仍然工作嗎? – 2009-08-04 13:53:24

3

我檢查了幾個問題,並決定重寫我的答案更準確。 看看字符串處理。每次你給一個字符串賦新值時,都會創建一個全新的字符串。注意:你正在循環中做很多大的字符串操作。首先,你有價值並做一些替代。然後你做一個大的連接(「喜歡」部分)。嘗試使用String.Format或 - 更好 - 使用StringBuilder類。字符串操作可能會極大地降低性能。

+0

很棒的建議。 +1 – 2009-08-04 14:23:56

+0

我知道如何替換字符串生成器,但在過濾器上執行concats的最佳方法是什麼? – 2009-08-04 15:19:05

+2

使用追加方法: http://msdn.microsoft.com/en-us/library/b4sc8ca8(VS.80).aspx – smok1 2009-08-04 15:20:51

1

我會建議不要創建一個過濾器,而是做這樣的事情

foreach (DataRow row in ResidentTBL.Rows) 
    if (IsMatch(row)) 
      newtable.ImportRow(row); 

其中IsMatch方法實現在你的過濾器的邏輯。這應該會給你一個更好的調整控制。 DataTable裝配器設計爲通用的,因此它們使用密鑰樣式算法的混搭。這並不總是找到記錄的最佳方式。

注意,我的例子是C#,你需要調整VB,但我並不像詩句。

0

你有沒有考慮轉換您的搜索算法使用LINQ到XML?這將爲您節省DataTable的沉重負擔。

您可以簡單地將XML文件加載到XmlDocument中,並對內存中的XML對象中的元素執行LINQ查詢。您可以在Linq-To-Xml tag page找到更多的問題和答案。 Contains()

如果你想繼續的DataTable實現,這裏有更多的info on using LINQ with DataTables:或許與LINQ To XML: How Does It Work?

有一個擴展方法,這將真正幫助你開始。

相關問題