使用联合来避免没有索引的搜索的示例:
DECLARE @T1 TABLE (ID VARCHAR(16), CODE INT)
DECLARE @T2 TABLE (ID VARCHAR(16), CODE INT)
INSERT INTO @T1 VALUES ('ASD',1)
INSERT INTO @T1 VALUES ('DFG',2)
INSERT INTO @T1 VALUES ('RTY',3)
INSERT INTO @T1 VALUES ('AZX',4)
INSERT INTO @T1 VALUES ('GTY',5)
INSERT INTO @T1 VALUES ('KKO',6)
INSERT INTO @T2 VALUES ('ASD',1)
INSERT INTO @T2 VALUES ('SD',2)
INSERT INTO @T2 VALUES ('DFG',3)
INSERT INTO @T2 VALUES ('RTY',4)
INSERT INTO @T2 VALUES ('AZX',5)
INSERT INTO @T2 VALUES ('ZX',6)
INSERT INTO @T2 VALUES ('GTY',7)
INSERT INTO @T2 VALUES ('GTYA',8)
INSERT INTO @T2 VALUES ('KKO',9)
INSERT INTO @T2 VALUES ('KKOA',10)
INSERT INTO @T2 VALUES ('AKKOA',11)
SELECT * FROM @T1 T1 INNER JOIN (SELECT ID FROM @T2 WHERE ID NOT LIKE '%A%')T2 ON T2.ID = T1.ID
UNION ALL
SELECT * FROM @T1 T1 INNER JOIN (SELECT REPLACE(ID,'A','')ID FROM @T2 WHERE ID LIKE '%A%')T2 ON T2.ID = T1.ID
这是在不进行模式更改的情况下可以做的事情。
如果进行模式更改,则需要在T2中创建一个计算索引列并与其连接。这样做速度更快,大部分工作都放在插入/更新上,以维护额外列和其上的索引。
JOIN
的参数不是sargable(可查询的)。这个词可能不在字典里,但它是你想要用来调查此问题的关键术语。 - Jeroen Mostert