Giả sử bạn có các trường của mình ở định dạng sau:
00Data0007
000000Data0011
0000Data0015
, bạn có thể làm như sau:
-
Tạo một cột được tính toán:
ndata AS RIGHT(REVERSE(data), LEN(data) - 4)
Điều này sẽ biến đổi các cột của bạn thành như sau:
ataD00 ataD000000 ataD0000
-
Tạo chỉ mục trên cột đó
-
Đưa ra truy vấn này để tìm kiếm chuỗi
Data
:SELECT * FROM mytable WHERE ndata LIKE N'ataD%' AND SUBSTRING(ndata, LEN(N'ataD') + 1, LEN(ndata)) = REPLICATE('0', LEN(ndata) - LEN('ataD'))
Điều kiện đầu tiên sẽ sử dụng một chỉ mục để lọc thô.
Điều thứ hai sẽ đảm bảo rằng tất cả các ký tự đứng đầu (đã trở thành ký tự cuối trong cột được tính) không có gì khác ngoài số không.
Xem mục này trong blog của tôi để biết chi tiết về hiệu suất:
Cập nhật
Nếu bạn chỉ muốn có một chỉ mục trên SUBSTRING
mà không cần thay đổi giản đồ của bạn, tạo chế độ xem là một tùy chọn.
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'