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

问题描述:

我有一个字符串“键”,我需要将其存储在SQL Server数据库列中。此密钥是由任意大小的令牌的点分隔列表。例子:如何为左侧优化的通配符搜索索引SQL Server字符串值?

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

我将需要令牌的任何集合从左边搜索行。所以,我可能想找到开始所有令牌:

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 | 

很显然,我得有N列的baseX,这是可怕的,但毫无疑问,这将是快。

假设我使用了一个简单的VARCHAR字段,有没有办法将这个字段编入索引,以便在我获得一百万行数据时可以接受?

+0

只要在它上面创建一个非聚集索引,只要'%'在右边,你就会得到有序的扫描结果。创建n列的想法在许多层面上都很糟糕,所以现在最好忘记它。 – dean

+2

如果您使用'foo。%'这样的''键,那么'key' *上的索引可以被使用。只有当你有一个领先的通配符,它​​变得不可SARGable – alroc

+0

** 2016.sucked **大声笑;) –

不,这没什么不好,因为在搜索字符串的开头没有通配符,这会使查询变得不可靠。由于键值本身中的第一个字符未知,因此必须扫描所有页面才能找到结果。

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

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