Ако приемем, че имате вашите полета в този формат:
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'))
Първото условие ще използва индекс за грубо филтриране.
Вторият ще се увери, че всички водещи знаци (които са станали завършващи знаци в изчислената колона) не са нищо друго освен нули.
Вижте този запис в моя блог за подробности за ефективността:
Актуализация
Ако просто искате индекс на 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'