1

我试图确定在表中的两列上实现部分搜索的最佳方法。目的是让此搜索尽快执行。

我们的问题是我们的数据库托管在 SQL Azure 上;不支持全文索引。这意味着我们在 SQL 中唯一可用的本机命令是CHARINDEX()LIKE '% %'

如果我们要在纯 T-SQL 中执行查询,查询的结构将是:

DECLARE @SearchTerm VarChar(255) = 'Luke'

SELECT  AU.UserID,
        AU.FirstName,
        AU.Surname
FROM dbo.Users AU
WHERE AU.FirstName LIKE '%'+@SearchTerm+'%'
OR AU.Surname LIKE '%'+@SearchTerm+'%'

我们还可以使用 Lucene;我们已经在 Windows Azure 上的 Worker Role 上设置了它,但是我们必须在数据库内部和 Lucene 中维护数据的完整性。

我想知道的是:

  1. LIKE有没有比我上面使用的更好的方法在 T-SQL 中执行搜索
  2. 如果我在包含名字和姓氏的表中添加一个计算列,这会提高查询的性能吗?
  3. 或者; 如果我们迁移到 Lucene;读取性能会比上述查询高得多吗?(关于这一点;表中当前有不到 10,000 行dbo.Users
  4. 打开门;是否有一些我们没有考虑过的方法可以使整个负载变得更容易?
4

1 回答 1

2

添加包含名字和姓氏的计算列将强制结果包含名字和姓氏,但您上面的 SQL 用于匹配名字或姓氏。

如果您想匹配名字和姓氏,计算列可能会更快,因为数据库程序员可以为您应用一些技巧(例如:Boyer-Moore 快速字符串搜索,随着模式大小的增加而变得更快)。

我对 Lucene 的体验是它比任何数据库搜索都快得多——我在日常硬件上没有看到任何更快的速度。但是正如您所说,您必须使 Lucene 索引与数据库保持同步。

于 2012-05-02T10:30:19.700 回答