提高“反向”LIKE 查询的性能

Vac*_*ano 5 sql t-sql sql-server

我有一个与此类似的查询:

SELECT  CustomerId
FROM    Customer cust
WHERE   'SoseJost75G' LIKE cust.ClientCustomerId + '%' -- ClientCustomerId is SoseJost 
Run Code Online (Sandbox Code Playgroud)

这样做的要点是,我从客户那里获得了一个价值,该价值是我的,ClientCustomerId但末尾附加了未知数量的额外字符。

所以在我的例子中,客户给了我,SoseJost75G但我的数据库只有SoseJost(最后没有75G。)

我的查询有效。但是运行需要一分钟多的时间。那是因为它不能使用 ClientCustomerId 上的索引。

有谁知道提高这种查询性能的方法?

Shn*_*ugo 3

你可以尝试这样的事情:

DECLARE @var VARCHAR(100)='SoseJost75G';

WITH pre_selected AS
(SELECT * FROM Customer WHERE ClientCustomerId  LIKE LEFT(@var,6) + '%')
SELECT * 
FROM pre_selected WHERE @var LIKE ClientCustomerId +'%';
Run Code Online (Sandbox Code Playgroud)

对于带有 fix start -search 的 LIKE,将使用 ClientCustomerId 上的现有索引。

对于 CTE,您永远无法确切知道将执行哪个执行顺序,但是 - 在一些快速测试中 - 优化器选择首先将集合减少到一个微小的休息,并执行繁重的搜索作为第二步。

如果执行顺序不是您期望的方式,您可以将第一个 CTE 查询的结果插入到声明的变量中(仅具有 ID 的列),然后继续使用这个小表...

像这样的东西

DECLARE @var VARCHAR(100)='SoseJost75G';

DECLARE @CustIDs TABLE(ClientCustomerID VARCHAR(100));
INSERT INTO @CustIDs(ClientCustomerID)
SELECT ClientCustomerID FROM Customer WHERE ClientCustomerId LIKE LEFT(@var,6) + '%';

--Use this with an IN-clause then
SELECT ClientCustomerId 
FROM @CustIDs WHERE @var LIKE ClientCustomerID +'%'
Run Code Online (Sandbox Code Playgroud)