Sql server SQL Server优化:更好地使用";“不为空”;或&燃气轮机;0";?
在SQL Server 2012中,我有一个可为null的INT列,当它有值时,该值大于0。因此,出于我的目的,这两种说法提供了相同的结果:Sql server SQL Server优化:更好地使用";“不为空”;或&燃气轮机;0";?,sql-server,query-optimization,Sql Server,Query Optimization,在SQL Server 2012中,我有一个可为null的INT列,当它有值时,该值大于0。因此,出于我的目的,这两种说法提供了相同的结果: ...WHERE MyColumn IS NOT NULL; ...WHERE MyColumn > 0; 我的问题是,作为一个规则,是一个或另一个更有效?假设列的索引正确。我会选择MyColumn>0的,因为它作为条件非常清晰,并且是自记录的 另一方面,MyColumn不为NULL的地方也很清楚,但在您的例子中,它隐藏了一个特殊的逻辑,而这个逻辑
...WHERE MyColumn IS NOT NULL;
...WHERE MyColumn > 0;
我的问题是,作为一个规则,是一个或另一个更有效?假设列的索引正确。我会选择MyColumn>0的
,因为它作为条件非常清晰,并且是自记录的
另一方面,MyColumn不为NULL的地方也很清楚,但在您的例子中,它隐藏了一个特殊的逻辑,而这个逻辑没有任何文档记录。尽管列的值域是整数,但您希望每个NOTNULL值都是正整数。对于其他人来说,这并不清楚
我认为不会有任何性能问题。我认为有时我们会过度分析某些内容。如果您有一个索引,并且只选择该列,那么这两个选项都会执行索引查找或索引扫描,如果您正在选择其他属性,那么它显然会执行rid lookup或key lookpup,或者完全不使用索引,而使用完全扫描,这取决于列的选择性。因此,在评估谓词时,我看不到任何性能上的差异
如果您有一个筛选索引,其中记录不为空,则IO中会有差异,因为记录中的读取次数不相同两个都不相同,如果您的列的值为-1,则它是有效的数字,第一个条件的值为true,第二个条件的值为false。我意识到两者都不相同,但就我而言,它们是一样的。我只对值大于0.1的记录感兴趣。这是两个完全不同的条件,它们并不等同。2.如果这些恰好与您拥有的数据相当,那么这是一种您真的不应该关心的极端微观优化。使用对您的查询最有意义的WHERE
子句。然后>0将更有效率。一个条件和空值是omitted@TomRegan如果您只对值为>0
的记录感兴趣,请使用where MyColumn>0
。做任何其他事情都会给其他必须阅读您的查询的人带来可怕的解析体验。这个级别的优化是不相关的。谢谢@Kannan,我们刚刚从SQLServer2005迁移过来,我还不习惯考虑过滤索引,但这正是我需要在这里使用的。