【问题标题】:How can I index SQL Server string values for optimized wildcard searching from the left?如何索引 SQL Server 字符串值以从左侧优化通配符搜索?
【发布时间】: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


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2011-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-03
    • 1970-01-01
    • 2017-07-13
    • 1970-01-01
    相关资源
    最近更新 更多