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 上的索引。
有谁知道提高这种查询性能的方法?
你可以尝试这样的事情:
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)
归档时间: |
|
查看次数: |
452 次 |
最近记录: |