【问题标题】:SQL Index on changed column更改列上的 SQL 索引
【发布时间】:2017-06-25 16:21:30
【问题描述】:

是否可以通过更改此列在列上创建索引。 例如 - 我有一列 A (nvarchar),但在查询中我应该替换该列中的值以与列表中的值进行比较。只有当我使用 A 列中的原始值时,经典索引才会起作用。

查询如下所示

SELECT
   * 
 FROM
    MyTable 
 WHERE
    REPLACE(A, ' ', '') IN ('aasa', 'asa', 'wew','wewe')

【问题讨论】:

  • 在 Where 子句中使用函数将避免使用 Index。使用replace 函数更新您的A 列,然后可以在where 子句中避免替换函数。
  • @Prdp 是的,我知道这种方式,但我需要存储原始值。目前我只看到了方法 - 用替换的数据创建新列 B 并在该列上创建索引。但是会有很多重复的数据。

标签: sql sql-server database indexing


【解决方案1】:

您可以创建计算列,然后在其上创建索引。

注意:SQL Server 索引键列有一个900 byte size limit。由于您的列是NVARCHAR,因此每个字符占用 2 个字节。因此,我们可以将索引限制为 400 个字符(800 个字节)。

为了节省空间,我们可以进一步限制此列包含一个值,前提是它满足您所需的条件。

ALTER TABLE MyTable
ADD A_NoSpace AS (CASE WHEN REPLACE(A, ' ', '') IN ('aasa', 'asa', 'wew','wewe') THEN LEFT(REPLACE(A, ' ', ''), 400) END) PERSISTED

CREATE NONCLUSTERED INDEX IX_A_NoSpace ON MyTable (A_NoSpace)

作为PERSISTED 列,计算只会在INSERTUPDATE 操作期间进行。

您现在可以在查询中使用此列:

SELECT *
FROM
MyTable
-- Don't need to check if value is in the list,
-- because we're already doing this in the computed column definition
WHERE A_NoSpace IS NOT NULL

【讨论】:

    猜你喜欢
    • 2014-09-19
    • 2011-08-31
    • 2016-05-24
    • 1970-01-01
    • 1970-01-01
    • 2013-03-30
    • 1970-01-01
    • 1970-01-01
    • 2014-08-16
    相关资源
    最近更新 更多