序
一般我们在定义表的时候,列定义越具体越好。然而,昨天我遇到了一个案例,更好的定义列类型但实际上增加了存储的使用,并没有明显的好处。
整数类型(int) - 使用 Numeric vs Int
在我处理数据库时,我遇到了一个奇怪的现象,多个列定义为numeric(7,0)、numeric(9,0)等等。似乎有人试图为数据库提供针对多个不同数据段的最具体定义。由于从未遇到过这种特殊的做法,我立即开始寻找原因。它小一些吗?更快?较好的?
存储
使用一个非常具体、定义良好的数字实际上消耗了我们的存储空间,而不是减少了存储空间。精度值为1到9的数字(或十进制)需要5个字节,精度值为10到19的数字(或十进制)需要9个字节。将其与多种int进行比较:
Digits(十进制数字大小) | Int 的衍生类型 | Int Bytes(占用字节) | Numeric(*,0) Bytes(占用字节) | Difference(差值) |
---|---|---|---|---|
1 - 2 | tinyint | 1 | 5 | 4 bytes |
3 - 4 | smallint | 2 | 5 | 3 bytes |
5 - 9 | int | 4 | 5 | 1 byte |
10 - 18 | bigint | 8 | 9 | 1 byte |
因此,对于包含该值的每一行和每一个索引,我们都会丢失存储空间。
引用: Int reference on MSDN and Numeric/Decimal reference on MSDN
性能 #1
当要求SQL Server执行数学函数(+、-、*、/)时,它使用一组定义的规则来确定输出类型,然后隐式地将参数转换为该类型(有关小数的子集,请参阅本文)。这意味着在许多情况下,可能会有从int到numeric的隐式转换,因此可能有人认为我们可以尝试通过将字段定义为numeric而不是int来调整性能。
让我们测试下隐式转换
/* ****** Creation of some number tables ****** */
--创建int表
Create Table NumberIntTest(Num Int Identity(1,1) Primary Key)
go
Set NOCOUNT ON
Begin TRAN
DECLARE @i int =0