我有一个带有以下示例表的SQLite(v3)数据库:
5列(“名字”,“姓氏”,“街道”,邮政编码,“城市”)
超过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秒钟才能得到结果。
如何加快所有可用数据的搜索过程?
最佳答案
尝试将需要搜索的所有字符串放在单个字符串中,并询问它是否contains
您要查找的值。这是我的测试结果,包含170万条记录(非常独特):
If DT.Select("street like '%" & SearchString& "%'").Count > 0 Then
运行大约需要11秒
如果我用长矛“ |”将所有值放入字符串中分离器然后运行
If StringToSearch.Contains(SearchString) then...
这大约需要20毫秒。甚至将所有字符串放入单个字符串的时间也只花了2秒钟,因此我每次都可以重新加载
StringToSearch
,但仍然比SELECT快。我什至没有使用StringBuilder
。但是,如果您可以保留变量'StringToSearch',而不必每次都重建它,它将更快。顺便说一句,遍历行并询问每个字段是否包含该值需要1.5秒:
If dr("street").ToString.Contains(SearchString) Then
最后,我确实尝试过Regex,但是与
Contains
同时进行。
关于vb.net - 加快大量数据的搜索过程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25119644/