sql - CONTAINS 与条件逻辑组合时的效率问题

标签 sql sql-server t-sql

我刚刚对用于返回一些搜索结果的查询的 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避免缓慢的OR条件

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) 

关于sql - CONTAINS 与条件逻辑组合时的效率问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30590721/

相关文章:

mysql - SQL 数据库中的持久变量?

c# - 如何在Azure SQL中记录UTC时间?

json - 如何计算 JSON 字符串中的节点数

sql-server - 将数据解析为单独的列

sql - T-SQL:交叉应用;订单项迭代次数过多

php - 为什么查询不像 phpmyadmin 中那样返回显示名称?

php - mysql/PHP mysql更新不更新数据库

c# - 强类型数据集大放异彩

sql - 在我的 sql 语句中,我对同一个参数调用 sum 两次,是否重复工作?

sql-server - TSQL程序求最大素数