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
)
)
谢谢。工会起了很大的作用。很高兴知道。我也会试试这个。谢谢。