SQL Server中的IN v / s OR运算符

时间:2015-08-17 23:06:46

标签: sql sql-server sql-server-2008

我在一个包含大量条目的表上查询,我试图提高性能。 以下哪个SQL查询将具有最佳性能?
我应该使用IN

select * from employee where id in (2,3,4,5)

或者我应该使用OR

select * from employee where id=2 or id=3 or id=4 or id=5

哪种说法在绩效方面更有效?

1 个答案:

答案 0 :(得分:3)

IN运算符实际上是由SQL Server查询优化器互操作/翻译为OR运算符。

例如我在我的Sql Server 2012实例上有Northwind数据库我使用IN运算符编写了以下两个查询,另一个使用OR运算符编写。

查询

SELECT * 
FROM dbo.Customers
WHERE CustomerID IN ('ALFKI','BLAUS','BONAP')
GO

SELECT * 
FROM dbo.Customers
WHERE CustomerID = 'ALFKI'
   OR CustomerID = 'BLAUS'
   OR CustomerID = 'BONAP'
GO

执行计划:

两个查询的执行计划完全相同;

blog

寻求谓词

查询优化器使两个查询完全相同,IN运算符被评估为OR运算符。

enter image description here

注意

要提高查询效果,您需要开始寻找问题与INOR运算符无关的问题,只需确保不要将IN与子OR一起使用-query可能会产生NULL,因为它也将被评估为WHERE Column = NULL运算符,当我们有一个表达式var inquirer = require("inquirer"); function runInquirer(choices) { inquirer.prompt([ { type: "checkbox", message: "Select toppings", name: "toppings", choices: choices } ], function( answers ) { console.log( JSON.stringify(answers, null, " ") ); }); } 时它会产生NULL,因此你会得到错误/意外的结果。