SQL Server 数据库优化顾问 -2.列数据类型 numeric 和 int 对比

本文探讨了在SQL Server中使用numeric与int数据类型作为列定义的优劣。尽管numeric提供了更具体的定义,但在存储和性能方面并不占优势。numeric类型可能导致更多的存储空间消耗和潜在的隐式转换性能影响,尤其是在自动参数化过程中。因此,对于不需要高精度的场景,使用int可能是更优的选择。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


一般我们在定义表的时候,列定义越具体越好。然而,昨天我遇到了一个案例,更好的定义列类型但实际上增加了存储的使用,并没有明显的好处。

整数类型(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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云策数据

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值