Mặc dù bạn có thể sử dụng hàm vô hướng như UPPER hoặc LOWER và bạn có thể đối chiếu lại cột để nó không còn phân biệt chữ hoa chữ thường, tất cả các cách tiếp cận này đều yêu cầu chuyển đổi dữ liệu đối với dữ liệu cơ sở sẽ không bao giờ cho phép tìm kiếm chỉ mục. Bạn cũng đang dẫn dắt THÍCH của mình bằng ký tự đại diện, vì vậy dù sao đây cũng không phải là vấn đề đáng lo ngại đối với bạn trong kịch bản này, nhưng nếu bạn từng muốn tìm kiếm phần bên trái của chuỗi một cách hiệu quả VÀ cho phép trình tối ưu hóa để tìm kiếm thông qua một chỉ mục, bạn có thể chỉ định chuỗi của mình bằng dấu ngoặc ([]) như sau:
SELECT *
FROM TABLE
WHERE Name LIKE '[hH][oO][sS][pP][iI][tT][aA][lL][iI][sS][tT]%'
Ví dụ này ( liên kết dbfiddle ở đây ) thực hiện công việc tốt hơn để hiển thị những gì tôi muốn nói:
CREATE TABLE #tmp_cohellation_fun
(
ID INT IDENTITY(1,1) PRIMARY KEY CLUSTERED
, myValue VARCHAR(50) COLLATE SQL_Latin1_General_CP1_CS_AS
)
-- Garbage values to represent data you don't want
INSERT INTO #tmp_cohellation_fun
SELECT CAST(NEWID() AS VARCHAR(50))
FROM master.sys.configurations t1
CROSS JOIN master.sys.configurations t2
CROSS JOIN master.sys.configurations t3;
-- Sprinkle a little bit of good data
INSERT INTO #tmp_cohellation_fun
(myValue)
VALUES ('Apple')
, ('apple')
-- Another healthy helping of garbage that we don't care about
INSERT INTO #tmp_cohellation_fun
SELECT CAST(NEWID() AS VARCHAR(50))
FROM master.sys.configurations t1
CROSS JOIN master.sys.configurations t2
CROSS JOIN master.sys.configurations t3;
-- Some more good data
INSERT INTO #tmp_cohellation_fun
(myValue)
VALUES
('aPple')
, ('APPLE')
, ('APple')
-- Final insert of garbage that we don't care about
INSERT INTO #tmp_cohellation_fun
SELECT CAST(NEWID() AS VARCHAR(50))
FROM master.sys.configurations t1
CROSS JOIN master.sys.configurations t2
CROSS JOIN master.sys.configurations t3
;
-- Create a nonclustered rowstore index
CREATE INDEX ix_myValue ON #tmp_cohellation_fun (myValue)
;
SET STATISTICS XML ON
;
-- Seek, but incorrect results
SELECT *
FROM #tmp_cohellation_fun
WHERE myValue LIKE 'apple%'
;
-- Scan, with correct results
SELECT *
FROM #tmp_cohellation_fun
WHERE myValue COLLATE SQL_Latin1_General_CP1_CI_AS LIKE 'apple%'
;
-- Seek, with correct results
SELECT *
FROM #tmp_cohellation_fun
WHERE myValue LIKE '[aA][pP][pP][lL][eE]%'
;
SET STATISTICS XML OFF
;
DROP TABLE IF EXISTS #tmp_cohellation_fun
select
thời gian. Bạn có thể làm điều này bằng cách tạo một cột mới với một tập hợp con của dữ liệu được chuyển đổi và sau đó lập chỉ mục cho nó, thường là trong thời gian bạn sẽ chạy ETL. Điều này sẽ có một chi phí bảo trì và không phải là một phương pháp tuyệt vời. B) Bạn có thể làm cho tìm kiếm truy vấn có thể tranh cãi hoặc sargable. Thay đổi truy vấn sẽSELECT * FROM TABLE WHERE VALUE LIKE %hospitalist
hoặcSELECT * FROM TABLE WHERE VALUE LIKE hospitalist%
sẽ làm việc. Ngoài ra, bạn đang xem xét phần cứng hoặc tính năng để tăng tốc độ trên thiết kế xấu.