如何索引 SQL 服务器字符串值以从左侧优化通配符搜索?
How can I index SQL Server string values for optimized wildcard searching from the left?
我有一个字符串 "key",我需要将其存储在 SQL 服务器数据库列中。此密钥是一个以点分隔的任意大小的令牌列表。示例:
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
字段,当我在这里获得一百万行数据时,有没有办法索引这个字段以使其可接受?
不,这还不错,因为您在搜索字符串的开头没有通配符,这会使查询不可搜索。它必须扫描所有页面才能找到结果,因为键值本身的第一个字符是未知的。
但在你的情况下,键值中间节点可以从 B 树的根中找到,因为我们知道起始字符。在 key
列上创建 Non clustered Index
应该会对您有所帮助。下面的查询仍然是可搜索的
SELECT * FROM [table] WHERE key LIKE 'foo.%'
我有一个字符串 "key",我需要将其存储在 SQL 服务器数据库列中。此密钥是一个以点分隔的任意大小的令牌列表。示例:
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
字段,当我在这里获得一百万行数据时,有没有办法索引这个字段以使其可接受?
不,这还不错,因为您在搜索字符串的开头没有通配符,这会使查询不可搜索。它必须扫描所有页面才能找到结果,因为键值本身的第一个字符是未知的。
但在你的情况下,键值中间节点可以从 B 树的根中找到,因为我们知道起始字符。在 key
列上创建 Non clustered Index
应该会对您有所帮助。下面的查询仍然是可搜索的
SELECT * FROM [table] WHERE key LIKE 'foo.%'