如何从左侧索引SQL Server字符串值以优化通配符搜索?

时间:2016-12-27 14:19:39

标签: sql sql-server indexing sql-like

我有一个字符串“key”,我需要将其存储在SQL Server数据库列中。此密钥是以点分隔的任意大小的令牌列表。例子:

keanu
2016.sucked
foo.bar.baz
the.cake.is.a.lie

我需要通过左侧的任何标记集合搜索行。所以,我可能想找到 start 的所有令牌:

foo
foo.bar
foo.bar.baz

(显然,最后一个是整个令牌)。

我知道如何在SQL中执行此操作的唯一方法是使用LIKE运算符:

SELECT * FROM [table] WHERE key LIKE 'foo.%'

这有多糟糕? LIKE因性能问题而闻名,但由于我总是从字符串的左端搜索并将右端开放 - 这有帮助吗?

我有一个短暂的想法做这样的事情:

| key         | base1 | base2    | base3       |
|-------------|-------|----------|-------------|
| foo.bar.baz | foo.  | foo.bar. | foo.bar.baz |

显然,我必须为baseX设置N列,这很糟糕,但毫无疑问它会很快。

假设我使用一个简单的VARCHAR字段,是否有一种方法可以将此字段编入索引,以便在此处获得一百万行数据时使其可接受?

1 个答案:

答案 0 :(得分:2)

不,它不坏,因为你没有在搜索字符串的开头有通配符,这会使查询不可搜索。它必须扫描所有页面才能找到结果,因为键值本身的第一个字符本身是未知的。

但是在你的情况下,键值中间节点可以从B树的根找到,因为我们知道起始字符。在Non clustered Index列上创建key可以为您提供帮助。以下查询仍然是sargable

SELECT * FROM [table] WHERE key LIKE 'foo.%'