2015-06-11 71 views
1

我有一个包含大约100万行的表。其中一列是一个字符串,我们称之为列A.在表列中查找列表中的每个字符串

现在我需要处理大约1000个字符串的列表L,大部分是一个或两个字,我需要查找表中的所有记录列A包含列表L中的1000个字符串之一。

我能想到的唯一方法是使用L中的每个字符串执行全表扫描,查找字符串是否为列的子字符串每一行。但是那将是O(n2),并且对于一百万行将需要很长时间。

有没有更好的方法?无论是在SQL中还是在C#代码中?

+0

包含A列的表是在数据库和列表L是在C#程序我想? – Fixation

+0

听起来像你需要一个[全文索引](https://msdn.microsoft.com/en-US/library/cc879306.aspx)。 – Glorfindel

回答

1

一百万行的意见建议是一个相对较小的数字,这些天事情会快很多。你应该能够拉从A列的所有字符串,用你的表的主键一起,到内存中,并用很长的正则表达式从1000个字符串组成做一个正则表达式搜索:

var regex = new Regex("string one|string two|string three|...|string one thousand"); 

由于正则表达式被编译成最后的自动机,你会得到相当快的扫描时间为您的字符串。完成筛选后,收集ID,并使用它们查询表中的完整行。

+0

我更熟悉这个选项,所以我选择这个作为我的问题的答案。但我相信其他选择也很棒。多谢你们。 – Cal

0

我建议看看full text search,它不会减少您必须执行的操作的次数,但它会提高性能。

0

假设您使用SQL Server(你应该总是使用相关的标签指定RDBMS),
您可以创建你的List<string>一个DataTable并将其发送到存储过程作为一个table valued parameter

在存储过程中,您可以使用该表值参数的简单连接到database_table.col contains(table_parameter.value)(使用full text search)上的表。 当然,如果你创建一个full text indexGlorfindel

1

最好的方法是使用linq。比方说,你有你的清单

List<string> test = new List<string>{"aaa","ddd","ddsc"}; 

然后使用LINQ可以建设工程

var match = YourTable.Where (t=> test.Contains(t.YourFieldName); 
+0

请让我知道你是否需要更多的解释 – Yuri

相关问题