sql - SQL Server 中的 IN 与 OR 运算符

标签 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

哪种语句在性能方面更有效?

最佳答案

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

执行计划:

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

enter image description here

寻求谓词

查询优化器对两个查询进行完全相同的互操作,并且 IN 运算符的计算方式与 OR 运算符相同。

enter image description here

注意

为了提高查询的性能,您需要开始寻找其他地方,问题不在于您的 INOR 运算符,只需确保您不使用 IN 带有可能产生 NULL 的子查询,因为它也将被计算为 OR 运算符,并且每当我们有一个表达式 WHERE Column = NULL 时产生 NULL 因此你会得到错误/意外的结果。

关于sql - SQL Server 中的 IN 与 OR 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32061123/

相关文章:

sql - 转换为日期时间 - 带有日期的 DateTime 列和带有时间的 nvarchar 列

sql - Group By 子句无法与 sp_executesql 一起正常工作

json - SQL Server 2016 - 如何从 JSON 中选择整数数组

.net - 如何在 C# 中以编程方式备份​​ SQL 数据库

sql - 执行 sp_executeSql for select...into #table 但无法选择出临时表数据

sql-server - 解决游标问题

mysql 在更新中嵌套选择

sql - 使用 VB.Net 访问数据库存储过程后返回 True/False

mysql - 检索用户作为参与者的每个对话的最后一条消息

sql - 将整数格式化为字符串