次の形式のフィールドがあると仮定します:
00Data0007
000000Data0011
0000Data0015
、次のことができます:
-
計算列を作成します:
ndata AS RIGHT(REVERSE(data), LEN(data) - 4)
これにより、列が次のように変換されます。
ataD00 ataD000000 ataD0000
-
その列にインデックスを作成する
-
このクエリを発行して、文字列
Data
を検索します :SELECT * FROM mytable WHERE ndata LIKE N'ataD%' AND SUBSTRING(ndata, LEN(N'ataD') + 1, LEN(ndata)) = REPLICATE('0', LEN(ndata) - LEN('ataD'))
最初の条件では、粗いフィルタリングにインデックスを使用します。
2つ目は、すべての先頭の文字(計算列の末尾の文字になった)がゼロに過ぎないことを確認します。
パフォーマンスの詳細については、ブログのこのエントリを参照してください:
更新
SUBSTRING
のインデックスが必要な場合 スキーマを変更せずに、ビューを作成することはオプションです。
CREATE VIEW v_substring75
WITH SCHEMABINDING
AS
SELECT s.id, s.data, SUBSTRING(data, 7, 5) AS substring75
FROM mytable
CREATE UNIQUE CLUSTERED INDEX UX_substring75_substring_id ON (substring75, id)
SELECT id, data
FROM v_substring75
WHERE substring75 = '12345'