【问题标题】:Adding an index / Full Text Search on some partial data for a Sql 2008 table field?为 Sql 2008 表字段的某些部分数据添加索引/全文搜索?
【发布时间】:2009-11-02 04:07:44
【问题描述】:

我有一个包含 guid 的字段。它们代表用户的 PunkBuster GUID。

是否可以在此字段上创建一个索引,该索引仅是 guid 的 最后一个 8 个字符?

我问的原因是你不能像 => '*abcdef' 这样进行全文搜索。 (至少我相信我在某处读到过……是 Sql 08 中的 Pro Full-Text Search 吗?)

可能的解决方案(我不太喜欢,是):-

  • 新表字段 -> NVARCHAR(8)。这包含 guid 的最后 8 个字符。在该字段上添加索引。
  • 新表归档 -> UNIQUE IDENTIFIER。反转 guid,然后将其保存在此字段中。然后我可以在 guid 上执行 FTS,但反转所请求的查询,然后在其上搜索 -> 'fedcba*'

现在两种方式都可以。但我不想在表中添加额外的数据.. 特别是如果它是相同的数据,只是“查看”不同。

我感觉大多数人可能会说我应该反向存储 guid,因为如果有人想要搜索 guid 的最后 5 个字符或 guid 的最后 12 个字符会发生什么?

因此,假设我们不想做任何这些,出于本次讨论的目的,我们可以在字段中的某些部分数据上创建索引吗?

【问题讨论】:

    标签: sql-server-2008 indexing full-text-search


    【解决方案1】:

    我唯一能想到的就是使用您提到的 8 个字符字段或反向 guid 字段创建索引视图。然后在索引视图上创建全文索引。

    【讨论】:

      【解决方案2】:

      您总是可以创建一个新的计算列并将其设为 PERSISTED,然后为其编制索引。

      ALTER TABLE dbo.YourTable
        ADD LastEightGUID AS RIGHT(CAST(PunkBusterID AS VARCHAR(50)), 8) PERSISTED
      

      然后在该新字段上创建索引

      CREATE NONCLUSTERED INDEX IX_LastEight 
         ON dbo.YourTable(LastEightGUID)
      

      马克

      【讨论】:

      • Marc,你能不能(很快)用外行的术语详细说明这个 PESISTED 关键字是/做什么? (在我得到罐装的“谷歌为它”回复之前..)
      • 是的,PERSISTED 意味着从表达式计算的值将保留在表中,就像您手动输入它们一样。意思是存储了计算的结果,并不是每次访问该列时都进行计算
      • 所以我不需要实际插入该字段的数据.. db 会这样做(在插入或更新时)?并导致它被持久化,它占用更多的高清空间但我可以创建一个索引对它..这意味着在该字段上搜索(或正确使用该索引等)时速度非常快.. ?
      • @Pure: 是的,绝对 - 您只需插入/更新“PunkBusterID”字段,其余的由 SQL Server 处理;是的,因为它是持久的并且可以被索引,所以它在搜索时应该是闪电般的速度:-)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-30
      • 1970-01-01
      • 2011-06-10
      • 2011-12-14
      • 2012-09-18
      • 2012-10-25
      • 1970-01-01
      相关资源
      最近更新 更多