【发布时间】:2016-12-27 14:19:39
【问题描述】:
我有一个字符串“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 字段,有没有办法索引这个字段,以便在这里获得一百万行数据时可以接受?
【问题讨论】:
-
只要在它上面创建一个非聚集索引,你就会得到有序的扫描,只要 '%' 在右边。创建 n 列的想法在很多层面上都是不好的,所以最好现在就忘记它。
-
如果您使用
key like 'foo.%',则可以使用key上的索引。只有当您有一个前导通配符时,它才会变为非 SARGable -
2016.sucked 哈哈 ;)
-
“任何大小”都是一个问题。要对其进行索引,它必须最大为 900 字节。
-
@MartinSmith - 那么当我的第一个索引键值为 100 字节,第二个索引键值为 950 字节并且正在搜索第一个键值索引扫描或搜索时会发生什么?
标签: sql sql-server indexing sql-like