0
この列が変更された列に対して索引を作成できますか? 例 - 私は列A(nvarchar)を持っていますが、クエリでは、この列の値をリストの値と比較する必要があります。私は変更された列のSQL索引
クエリが
次SELECT
*
FROM
MyTable
WHERE
REPLACE(A, ' ', '') IN ('aasa', 'asa', 'wew','wewe')
この列が変更された列に対して索引を作成できますか? 例 - 私は列A(nvarchar)を持っていますが、クエリでは、この列の値をリストの値と比較する必要があります。私は変更された列のSQL索引
クエリが
次SELECT
*
FROM
MyTable
WHERE
REPLACE(A, ' ', '') IN ('aasa', 'asa', 'wew','wewe')
あなたは計算列を作成し、それにインデックスを作成することができますように見える列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)
、計算だけでINSERT
かUPDATE
操作中に行われます。
今、あなたのクエリにこの列を使用することができます。
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
句は 'Index'を使用して避けることができますどこで関数を使用します。 'A'カラムを' replace'関数で更新し、 'where'節で関数を置き換えることができます。 –
@Prdpはい、私はこの方法を知っていますが、元の値を保存する必要があります。現時点では、データを置き換えて新しい列Bを作成し、この列にインデックスを作成するしか方法がありません。しかし、重複したデータがたくさんあります。 – AndrewVA
[SQL Server - 計算列のインデックス?](SQL Server - インデックス323214/sql-server-index-on-a-computed-column)の可能な複製 – Serg