2017-02-08 5 views
0

この列が変更された列に対して索引を作成できますか? 例 - 私は列A(nvarchar)を持っていますが、クエリでは、この列の値をリストの値と比較する必要があります。私は変更された列のSQL索引

クエリが

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

句は 'Index'を使用して避けることができますどこで関数を使用します。 'A'カラムを' replace'関数で更新し、 'where'節で関数を置き換えることができます。 –

+0

@Prdpはい、私はこの方法を知っていますが、元の値を保存する必要があります。現時点では、データを置き換えて新しい列Bを作成し、この列にインデックスを作成するしか方法がありません。しかし、重複したデータがたくさんあります。 – AndrewVA

+0

[SQL Server - 計算列のインデックス?](SQL Server - インデックス323214/sql-server-index-on-a-computed-column)の可能な複製 – Serg

答えて

0

あなたは計算列を作成し、それにインデックスを作成することができますように見える列Aから元の値を使用する場合は古典的な指標のみ動作します。

注: SQL Serverのインデックスキー列は900 byte size limitです。あなたの列はNVARCHARなので、各文字につき2バイトを消費します。だから、400文字(800バイト)でインデックスを覆うことができます。

スペースを節約するため、必要な条件を満たす場合にのみ、この列に値を含めるように制限することができます。 PERSISTED列ビーイング

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) 

、計算だけで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 
関連する問題