我有一个带有以下示例表的SQLite(v3)数据库:
5列(" FirstName"," LastName"," Street",ZIPCode," City")
超过1' 100' 000行
我正在寻找VB.NET中最快的方法来查找整个数据中输入的搜索字符串。此输入的搜索字符串应与字段的完整内容匹配,或仅与其中的一部分匹配。
到目前为止,我尝试将整个数据加载到数据表中(大约需要40秒)。然后我尝试使用此SQL命令进行搜索:
dt.Select("FirstName LIKE '%" + SearchString + "%'")
在我的另一种方法中,我创建一个已排序的DataView并使用RowFilter命令进行搜索:
dvSORTED.RowFilter = "FirstName LIKE '%" & SearchString & "%'"
第一种方法在1,1秒内返回少量结果(~100),第二种方法需要1.5秒。
对于单个列中的搜索,这是正确的。对于每个附加列,搜索时间将乘以上述时间。所有列中的搜索大约需要8秒(5 x 1,5)。
小比较:如果我直接在SQLiteSpy中执行此SQL命令
SELECT FirstName, LastName, Street, ZIPCode, City FROM Addresses WHERE FirstName LIKE "%Peter%" or LastName LIKE "%Peter%" or Street LIKE "%Peter%" or City LIKE "%Peter%"
然后我必须等待大约10秒才能得到结果。
如何加快所有可用数据的搜索过程?
答案 0 :(得分:1)
尝试将您需要搜索的所有字符串放在一个字符串中,并询问它是否contains
您要查找的值。以下是我的测试结果,有170万条记录(相当独特):
If DT.Select("street like '%" & SearchString& "%'").Count > 0 Then
这需要大约11秒才能运行
如果我把所有的值都放入一个带有长矛的字符串" |"分隔符,然后运行
If StringToSearch.Contains(SearchString) then...
这花了大约20ms。即使将所有字符串放入单个字符串的时间也只花了2秒,所以我每次都可以重新加载StringToSearch
并且仍然比SELECT更快。我甚至没有使用StringBuilder
。但是,如果你能保持变量' StringToSearch'周围,而不是每次都重建它,它会更快。
BTW,遍历行并询问每个字段是否包含该值需要1.5秒:
If dr("street").ToString.Contains(SearchString) Then
最后,我确实尝试过Regex,但与Contains
同时进行。