请在SO上考虑以下答案,以确保向<>运算符提问:

<> ... ...与!=相同。

,但随后出现了注释器,并说:

的确,它们在功能上是相同的。但是,SQL优化器如何使用它们却大不相同。 = /!=简单地评估为true / false,而<>表示引擎必须查看并查看该值是大于还是小于,这意味着更多的性能开销。编写昂贵的查询时只是要考虑的事情。

我相信这是错误的,但是为了解决潜在的怀疑者,我想知道是否有人可以提供权威或规范的资料来证明这些运算符不仅在功能上相同,而且在各个方面都相同?

#1 楼

在解析过程中,SQL Server调用sqllang!DecodeCompOp来确定存在的比较运算符的类型:



在优化程序中的任何事情涉及之前,这种情况就发生了。


来自比较运算符(Transact-SQL)




使用调试器和公共符号*跟踪代码,sqllang!DecodeCompOp返回一个值在寄存器eax **中如下所示:

 ╔════╦══════╗
║ Op ║ Code ║
╠════╬══════╣
║ <  ║    1 ║
║ =  ║    2 ║
║ <= ║    3 ║
║ !> ║    3 ║
║ >  ║    4 ║
║ <> ║    5 ║
║ != ║    5 ║
║ >= ║    6 ║
║ !< ║    6 ║
╚════╩══════╝
 


!=<>都返回5,所以在以后的所有操作(包括编译和优化)中都是无法区分的。


尽管仅次于上述几点,但也有可能(例如,使用未记录的跟踪标志8605)查看逻辑树传递给优化器以确认!=<>都映射到ScaOp_Comp x_cmpNe(不等于标量运算符比较)。

例如:

SELECT P.ProductID FROM Production.Product AS P
WHERE P.ProductID != 4
OPTION (QUERYTRACEON 3604, QUERYTRACEON 8605);

SELECT P.ProductID FROM Production.Product AS P
WHERE P.ProductID <> 4
OPTION (QUERYTRACEON 3604, QUERYTRACEON 8605);


都产生:

q 4312078q


脚注


*我使用WinDbg;其他调试器也可用。可通过常规的Microsoft符号服务器获得公共符号。有关详细信息,请参阅SQL Server客户咨询团队深入了解使用Minidumps进行SQL Server和WinDbg进行SQL Server调试– Klaus Aschenbrenner的介绍。

**在32位Intel衍生产品上使用EAX从函数返回值很常见。当然,Win32 ABI就是这样做的,而且我很确定它是从旧的MS-DOS时代继承了这种做法的,当时AX被用于相同的目的-MichaelKjörling


#2 楼

我在Microsoft的SQL支持部门工作,我问高级升级工程师和SQL Server性能主题专家Jack Li,“ SQL对待!=与<>有什么不同吗?”他说:“他们是一样的。”

评论


Microsoft为什么要删除调试器?微软中真的没有一个可以再次实现这一目标吗?为什么没有人回答?这让我很烦。如果可以回答?谢天谢地,我希望你祝一切顺利。

–阿米尔侯赛因
7月5日8:44

dba.stackexchange.com/questions/221349 / ...我不知道。我可以问一下。

– stacylaray
7月8日20:28



一种解决方法是添加用于调试的输入参数并将其设置为关闭。当您要调试时,将其打开并放入打印语句。这不需要sysadmin权限,并且无论连接到哪个数据库都可以使用。调试器要求您是sysadmin,并且需要打开许多端口,许多客户无法使用。此外,出于显而易见的原因,它无法连接到AzureDB。

– stacylaray
7月8日20:43

哇,非常感谢你

–阿米尔侯赛因
7月9日14:56

#3 楼

我认为以下事实证明<>没有进行2次比较。


SQL Standard 92将<>定义为不等于运算符(http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt)。从技术上讲,!=是对该标准的扩展(即使我不能考虑任何未实现该标准的RDBMS)。
如果SQLServer将<>视为2个运算符,而不是一个运算符,则对><会执行相同的操作,这实际上是语法错误。


#4 楼

这是不正确的,在线图书(BOL)表示它们在功能上是相同的:

!=(不等于)(Transact-SQL)

使用!=的执行计划,在Predicate下将!=更改为<>

评论


问题是,尽管您和我都知道“功能相同”包括其实际工作方式及其任何性能特征,但是“功能相同”一词已在引用的注释中被接受,但对性能有所不同。如果要证明这一点超出所有坚定的怀疑,那么该怎么办?

– ErikE
16年11月30日在20:50