我刚刚注意到,在我们的数据库中,我们有一个将BIT
列转换为INT
. 基础表有一个计算BIT
列,其定义如下:
IncludeInJobTotals as (CONVERT(bit,
case
when FL.[Status]=(5)
or FL.[Status]=(3)
or FL.[Status]=(2)
then (1)
else (0)
end,(0)))
在使用的视图中,IncludeInJobTotals
我们将其转换为INT
. 这会导致任何性能问题吗?可能还有哪些问题?有什么理由使用INT
overBIT
吗?
首先回答一般性问题,是的,视图中的数据类型绝对会影响性能。让我们模拟一些数据来说明一个简单的例子:
以下两个查询返回相同的结果,但性能却大不相同:
如果我进行了错误的数据类型转换,过滤器将不再可优化搜索。它不能在列上使用索引,并且基数估计会因为不能使用直方图而受到影响。
BIT
在您将列投射到 an 的情况下是否重要INTEGER
?我们可以过滤视图中的IncludeInJobTotals
和IncludeInJobTotals_INT
列以运行一些测试。基于数据类型优先级,我们应该期望在 a和 an之间的任何比较中 aBIT
将转换为an 。SQL Server应该能够在它们之间进行隐式转换,所以我认为很难找到性能问题。INTEGER
BIT
INTEGER
由于我们处理的是位列,因此简单过滤器的可能测试用例并不多。如果我在视图的任一列上过滤以查找具有
0
值的行,我总是会得到索引查找和正确的基数估计:如果我过滤视图的任一列以查找具有
1
值的行,我总是会得到表扫描和正确的基数估计:寻找超出范围的值也按预期工作:
我不会担心这种数据类型更改的性能。很难想象您会遇到性能问题的场景。但是,请务必注意,使用视图的查询可能会根据您使用列的方式返回不同的结果。BIT数据类型的行为不同于
INT
:回到数据类型优先级列表,一个
VARCHAR
值将被转换为一个BIT
值。这意味着获得不同结果的一种方法是过滤或加入超出范围的VARCHAR
值:也许您的应用程序永远不会这样做,但您希望在那种情况下发生什么?我会在这里关注正确性而不是性能。