Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
需要通过CPP重构SQL查询以减少执行时间_Sql_Sql Server_Tsql_Database Performance - Fatal编程技术网

需要通过CPP重构SQL查询以减少执行时间

需要通过CPP重构SQL查询以减少执行时间,sql,sql-server,tsql,database-performance,Sql,Sql Server,Tsql,Database Performance,下面的查询执行需要两分钟以上的时间。使用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 = ?

下面的查询执行需要两分钟以上的时间。使用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%';
计划对查询进行索引和重构,以加快执行速度。 如何重构上述查询

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

查询1

Select EmpId 
FROM TableA 
WHERE findstring like '%Raj%' 
and '%Guptha%';
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*);
查询2

Select EmpId 
FROM TableA 
WHERE findstring like '%Raj%' 
and '%Guptha%';
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*);

我认为任何索引都无法帮助您完成此查询,因为像“%EMPFirstName%”这样的
的用法被称为非参数(因为索引位于B树实现的底部,在开始和结束时使用%需要检查所有索引(或很大一部分,并让引擎根据成本进行选择)
另外,您没有对任何列使用和“%EMPLastName%”的概念是什么,因此默认情况下为true


您可以发布此查询的执行计划吗?您可以上载并共享生成的链接
和TableA.findstring,如“%EMPFirstName%”和“%EMPLastName%”
甚至不是有效的SQL。但正如Felipe所说,通配符搜索做不了多少工作。
TableA.findstring
上的索引可能会有所帮助,因为它允许SQL Server加载最小数量的数据以查找所需的记录,仍然是所有记录,但每个记录只包含一列。我们需要查看您的计划。请回答您的问题,添加表和索引定义,并通过我已更新查询字符串中的正确值来共享查询计划。列“findstring”的长度值为300rs(firstname、lastname、加入日期、ssn等)。我们正在从值中搜索firstname(Raj)和lastname(Guptha)。我已更新了查询字符串中的正确值。“findstring”列的值长度为300个字符(firstname、lastname、加入日期、ssn等)。我们正在搜索firstname(Raj)和lastname(Guptha)查询拆分是否会减少查询的执行时间?如果是,我们如何在CPP中执行?如我前面所说,索引是B树结构,但如果使用通配符(%mean no char,1 char或n char)作为前缀和后缀,算法无法在内部选择正确的路径,例如表达式%Raj%的有效输出可以是:-Raj-Raj123-Raj1-1Raj-RajRaj-123Raj-123Raj123您需要删除表达式某些部分中的通配符,并在代码中进行一些验证,以避免前面和后面需要%在绳子的后面