首页 > 解决方案 > 需要重构 SQL Query 以通过 CPP 减少执行时间

问题描述

下面的查询执行需要两分钟以上。使用 SQL Server。

Select  lastname
      , firstname
      , gender CASE WHEN TableB.orderno is null THEN TableA.EmpId ELSE TableB.orderno END as 'EmpId'
FRO TableA
LEFT JOIN TableB  ON TableA.EmpId = TableB.EmpId
WHERE TableA.userId = ? 
and TableA.findstring like '%Raj%' 
and '%Guptha%';

计划对查询进行索引和重构以加快执行速度。如何重构上述查询?

我尝试按如下方式拆分查询,以下拆分查询为 Query#1 和 Query#2 是否可取?如何将 Query#1 结果集(超过 2000 条记录)作为CPP中的输入传递给 Query#2 ?

查询 1

Select EmpId 
FROM TableA 
WHERE findstring like '%Raj%' 
and '%Guptha%';

查询 2

Select  lastname
      , firstname
      , gender CASE WHEN TableB.orderno is null THEN TableA.EmpId ELSE TableB.orderno END as 'EmpId'
FROM TableA
LEFT JOIN TableB ON TableA.EmpId = TableB.EmpId
WHERE TableA.userId = ? 
and TableA.EmpId IN (*RESULT OF Query 1*);

标签: sqlsql-servertsqldatabase-performance

解决方案


我认为任何索引都不能帮助您处理这个查询,因为它的使用like '%EMPFirstName%'称为非SARG参数(因为索引位于 B-Tree 实现的底部,并且在开头和结尾使用 % 需要检查所有索引(或很大一部分并根据成本选择引擎)此外,您没有针对任何列使用“%EMPLastName%”的想法是什么,因此默认情况下它是正确的。

你能发布这个查询的执行计划吗?您可以上传到https://www.brentozar.com/pastetheplan/并分享生成的链接


推荐阅读