【发布时间】:2016-11-01 23:21:23
【问题描述】:
假设我有一个带有int PK 列和nvarchar(max) 的SQL 表。在nvarchar(max) 列中,我有一堆表格条目,都是这样的:
SOME_PEOPLE_LIKE_APPLES
SOME_PEOPLE_LIKE_APPLES_ON_TUESDAY
SOME_PEOPLE_LIKE_APPLES_ON_THE_MOON
SOME_PEOPLE_LIKE_APPLES_ON_THE_MOON_CAFE
SOME_PEOPLE_LIKE_APPLES_ON_THE_RIVER
.
.
.
SOME_ANTS_HATE_SYRUP
SOME_ANTS_HATE_SYRUP_WITH_STRAWBERRIES
有数百万行 - 那么假设我的目标是找到与输入 searchTerm 重叠最多的行 - 所以在这种情况下,如果我输入 SOME PEOPLE_LIKE_APPLES_ON_THE_MOON_MOUNTAIN,则返回的条目将是第三个条目从上表来看,SOME_PEOPLE_LIKE_APPLES_ON_THE_MOON
我有一个非常天真的 SPROC,它遍历整个表如下:
SELECT DISTINCT phrase, len(phrase) l, [id] FROM X WHERE searchTerm LIKE phrase + '%'
-- phrase is the row entry being searched against
-- searchTerm is the phrase we're searching for
然后我将ORDER BY 长度并仅选择TOP
有没有办法加快这个速度,也许通过做一些索引?
如果这令人困惑,请将其视为tableRowEntry + wildcard = searchTerm
如果这有什么不同的话,我正在使用 MSSQL 2008
【问题讨论】:
-
您的查询应该使用
searchTerm上的索引,假设phrase确实是一个常量参数。 -
马特,看看我的更新示例......
标签: sql sql-server indexing