SQL Server';在';与';小于';
我有一个我正在复制的地址表。有14种不同类型的地址可用。为了减少复制的数据,我在AddressType字段上进行筛选。该字段为int,其值为1到14。我最初有一个过滤器SQL Server';在';与';小于';,sql,sql-server,Sql,Sql Server,我有一个我正在复制的地址表。有14种不同类型的地址可用。为了减少复制的数据,我在AddressType字段上进行筛选。该字段为int,其值为1到14。我最初有一个过滤器 AddressType = 2 AddressType < 3 ,因为我只对那种类型的地址感兴趣。但是,最近的一项更改要求我同时复制了AddressType 1和AddressType 2。我先把过滤器换成了 AddressType in (1,2) 如果有一个过滤器,我会过得更好吗 AddressType = 2
AddressType = 2
AddressType < 3
,因为我只对那种类型的地址感兴趣。但是,最近的一项更改要求我同时复制了AddressType 1和AddressType 2。我先把过滤器换成了
AddressType in (1,2)
如果有一个过滤器,我会过得更好吗
AddressType = 2
AddressType < 3
AddressType<3
想法 当数字变大时,可能会有显著差异。在较小的数字上,您不会看到性能差异,但当它变大时,您会看到性能差异,特别是在AddressType上有索引的情况下。您的
IN()
版本基本上被转换为:
WHERE AddressType = 1
OR AddressType = 2
OR ...
我同意其他人对这个具体案例的看法。(1) 只有14个值时,性能差异不太可能明显。(2) Jonathan的观点是,IN()
更准确地反映了您想要做的事情,这也是一个很好的观点
但对于可能有更多可能值的未来读者,我认为重要的是要注意,当列表不受限制时(或者当执行计划看起来完全相同时),情况会发生怎样的变化。我倾向于说,如果您需要添加另一个地址类型,如“5”,您应该使用这将迫使您重写
就性能而言,在这两者之间基本上没有什么可选择的。小于的操作可能会稍微快一点,但幅度不太可能是可测量的。所有答案都很好……与其他海报一样……可能会产生不同的是“你还可以做些什么” 在任何比较中总是考虑NULL。您的查询是写的好WRT NULL,但是:如果空值是可能的……并且如果您决定改变或重用SQL ad hoc,说,否定它……您可能会有一个比较的问题,而不是在.中。 例如,在(1,2)中如何执行vs>=3…或我们可能使用的任何化身。NULL在第一个中为TRUE,但在第二个中为FALSE。(NULL是比较)
考虑空值就像呼吸SQL创建一样。这无关紧要,选择最容易键入的类型。只有当您有数百个输入和处理类型时,这才开始起作用。如果您查看执行计划,就会发现有一点不同。同意这并不真的重要。查看第二个可能有slig的原因但是它的优点是。
NULL
与任何比较都不匹配,除了是NULL
。你说NULL不在(1,2)
中是真的,事实上是假的。我考虑过这一点。但是将<3改为(1,2,3)并不需要太多输入。