Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.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
Sql 将包含与条件逻辑结合时的效率问题_Sql_Sql Server_Tsql - Fatal编程技术网

Sql 将包含与条件逻辑结合时的效率问题

Sql 将包含与条件逻辑结合时的效率问题,sql,sql-server,tsql,Sql,Sql Server,Tsql,我刚刚修改了我用来返回一些搜索结果的查询的WHERE子句 我从以下几点开始: WHERE ( CONTAINS(MD_Entity.Forename, @Forename) AND CONTAINS(MD_Entity.Family_Name, @FamilyName) ) AND ( MD_Entity_Role.Role_Type = 2 OR MD_Entity.Do_Not_Transact = 1 ) 并将其更改为: WHERE (

我刚刚修改了我用来返回一些搜索结果的查询的
WHERE
子句

我从以下几点开始:

WHERE 
(
    CONTAINS(MD_Entity.Forename, @Forename) 
    AND CONTAINS(MD_Entity.Family_Name, @FamilyName)
) 
AND 
(
    MD_Entity_Role.Role_Type = 2
    OR MD_Entity.Do_Not_Transact = 1
)
并将其更改为:

WHERE 
(
    CONTAINS(MD_Entity.Forename, @Forename) 
    AND CONTAINS(MD_Entity.Family_Name, @FamilyName) 
    AND MD_Entity_Role.Role_Type = 2
)
OR 
(
    CONTAINS(MD_Entity.Family_Name, @Forename) 
    AND CONTAINS(MD_Entity.Family_Name, @FamilyName) 
    AND MD_Entity.Do_Not_Transact = 1
)
查询从立即返回结果到只需一分钟


我不是
SQL
专家,所以我显然在这里犯了一些效率失礼的错误。首先,有人能解释一下为什么效率下降得如此之快吗?其次,有没有更快的方法来完成我在这里所做的事情?

重新排序条件,第一个越快

WHERE 
(   1 = 1
    AND MD_Entity_Role.Role_Type = 2
    AND CONTAINS(MD_Entity.Forename, @Forename) 
    AND CONTAINS(MD_Entity.Family_Name, @FamilyName) 

)
OR 
(   1 = 1
    AND MD_Entity.Do_Not_Transact = 1
    AND CONTAINS(MD_Entity.Family_Name, @Forename) 
    AND CONTAINS(MD_Entity.Family_Name, @FamilyName) 
)
使用
UNION
避免慢速
情况

WHERE 
    1 = 1
    AND MD_Entity_Role.Role_Type = 2
    AND CONTAINS(MD_Entity.Forename, @Forename) 
    AND CONTAINS(MD_Entity.Family_Name, @FamilyName) 

UNION

WHERE
    1 = 1
    AND MD_Entity.Do_Not_Transact = 1
    AND CONTAINS(MD_Entity.Family_Name, @Forename) 
    AND CONTAINS(MD_Entity.Family_Name, @FamilyName) 
试试这个
它可能允许查询优化器更快地进行筛选

WHERE 
CONTAINS(MD_Entity.Family_Name, @FamilyName)
AND 
(
  (
    CONTAINS(MD_Entity.Forename, @Forename) 
    AND MD_Entity_Role.Role_Type = 2
  )
  OR 
  (
    CONTAINS(MD_Entity.Family_Name, @Forename)          
    AND MD_Entity.Do_Not_Transact = 1
  )
)

谢谢。工会起了很大的作用。很高兴知道。我也会试试这个。谢谢。