我有一张大约有100万行的表。其中一列是字符串,我们称之为A列。
现在我需要处理大约1,000个字符串的列表L,大多数是一个或两个单词,我需要找到表中的所有记录,其中列A包含列表L中的1,000个字符串之一。
我能想到的唯一方法是使用L中的每个字符串进行全表扫描,查找字符串是否是每行的A列内容的子字符串。但那将是O(n2),对于一百万行,它将花费很长时间。
有更好的方法吗?在SQL中还是在C#代码中?
答案 0 :(得分:1)
如今,一百万行的数量相对较少。您应该能够将A列中的所有字符串与表的主键一起提取到内存中,并使用由1000个字符串组成的非常长的正则表达式进行正则表达式搜索:
var regex = new Regex("string one|string two|string three|...|string one thousand");
由于正则表达式被编译成最终的自动机,因此您的字符串扫描时间会相当快。完成过滤后,收集ID,并使用它们从表中查询完整行。
答案 1 :(得分:1)
最好的方法是使用linq。让我们说你有你的清单
List<string> test = new List<string>{"aaa","ddd","ddsc"};
然后使用Linq你可以构思
var match = YourTable.Where (t=> test.Contains(t.YourFieldName);
答案 2 :(得分:0)
我建议查看full text search,它不会减少您必须执行的操作次数,但会提高性能。
答案 3 :(得分:0)
假设您使用Sql server(您应该始终使用相关标签来指定rdbms ),
您可以从DataTable
创建List<string>
,并将其作为table valued parameter发送到存储过程。
在存储过程中,您可以使用该表值参数的简单连接到database_table.col contains(table_parameter.value)上的表(使用full text search)。 当然,如果您按照full text index
的评论中的建议创建Glorfindel,事情会更快