2014-12-07 55 views
3

我是t-sql和sql server的新手,我有一个关于短路和全文搜索的问题。 假设我有这样的语句:用全文搜索谓词在sql server中短路

SELECT * 
FROM t1 
LEFT JOIN t2 
ON t1.Id = t2.Id 
WHERE contains(t1.Field1,@word) or contains(t2.Field2,@word) 

这里我的想法是检查t1.Field1包含@word,如果这是真的 - 不需要检查第二conditon,如果是假的 - 检查第二个包含。但我已经明白,这不起作用,并且此查询执行包含并花费时间来处理不必要的工作。所以我想问如何避免执行这些不必要的谓词。

+1

你有什么证据证明它正在做额外的工作?我会将其改为“和(包含(t1.Field1,@ word)或包含(t2.Field2,@ word))” – Paparazzi 2014-12-08 19:32:16

+1

[SQL Server中的OR操作符短路](http:// stackoverflow。 COM /问题/ 11219791 /或运营商短路式-SQL服务器) – 2014-12-09 14:14:10

回答

0

我曾经有过一个类似的问题和整个见地的文章姆拉登Prajdić传来:

http://weblogs.sqlteam.com/mladenp/archive/2008/02/25/How-SQL-Server-short-circuits-WHERE-condition-evaluation.aspx

总之,T-SQL不支持布尔值的短路的方式命令式语言,如C#做,因为谓词的评估顺序不能得到保证。

实现谓词有序评估的唯一方法是使用CASE WHEN构造,该构造从左向右评估谓词并在第一个谓词停止。如果潜在的性能提升是合理的,则可以将您的查询重写为:

SELECT * 
FROM t1 
LEFT JOIN t2 
ON t1.Id = t2.Id 
WHERE 
    Case 
    When contains(t1.Field1,@word) Then 1 
    When contains(t2.Field2,@word) Then 1 
    Else 0 
    = 1 

在某些情况下,此方法可能有用。不过,我不会推荐它作为常见的做法,因为它会使代码变得不易读,甚至可能会降低性能。

相关问题