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



我有一个字符串"键",我需要将其存储在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字段,当我在此处获得一百万行数据时,是否有一种方法可以索引此字段?

不,这还不错,因为您在搜索字符串开始时没有通配符,这会使查询变得不可降低。它必须扫描所有页面才能找到结果,因为键值本身中的第一个字符本身尚不清楚。

但是,在您的情况下,钥匙值中间节点可以从b-tree的根中找到,因为我们知道起始字符。在key列上创建Non clustered Index应该为您提供帮助。以下查询仍然是可害羞的

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

最新更新