sql - 需要重构 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*);
解决方案
我认为任何索引都不能帮助您处理这个查询,因为它的使用like '%EMPFirstName%'
称为非SARG参数(因为索引位于 B-Tree 实现的底部,并且在开头和结尾使用 % 需要检查所有索引(或很大一部分并根据成本选择引擎)此外,您没有针对任何列使用“%EMPLastName%”的想法是什么,因此默认情况下它是正确的。
你能发布这个查询的执行计划吗?您可以上传到https://www.brentozar.com/pastetheplan/并分享生成的链接
推荐阅读
- php - 来自数据库的php循环
- ruby - Ruby 类中的可选哈希选项
- python - 比较运算符如何与 a[i:] < b[i:] 一起使用?
- javascript - 在 Web 应用程序上导航
- vba - 从 VBA 控制 Internet Explorer
- powershell - 如何使用 Powershell 删除映射的网络驱动器?
- python - Python中的usecols没有读取我的CSV中的标题
- php - 使用 lumen 运行 cron 时:“插入”命名空间中没有定义任何命令。
- git - git log 的 `--pretty=""` 中的 "" 是什么意思
- javascript - 如何使用 rowsGroup 和 rowGroup 扩展为数据表中的每个组带来汇总(汇总总和)