更改列

时间:2017-02-08 06:51:50

标签: sql sql-server database indexing

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

查询看起来像下一个

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

1 个答案:

答案 0 :(得分:0)

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

注意: 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