暂无图片
SQL Server id>2147483647查询超时
我来答
分享
Coolkid
2024-03-15
SQL Server id>2147483647查询超时

今天同事归档sqlserver数据库的数据时遇到一个很有意思的案例: 

数据库类型:Sql Server 2008R2、Sql Server2016

 ID字段类型:PK(聚集索引),bigint 

有个表存了几十亿行数据,今天给这个表做归档,大概语句insert into XXX SELECT ... from table where id>=XXX and id<XXX,前二十亿的归档都很顺利,直到在归档id范围包含2147483647这个数值时,出现了超时,然后一点点缩减范围排查。

测试结果如下: 

1、SELECT id from table where id>2147483646 and id<2147483648;  --查询超时,IO飙升 

2、SELECT id from table where id>=2147483647 and id<2147483648; --查询超时,IO飙升 

3、SELECT id from table where id>=2147483646 and id<2147483647; --结果集秒出 

4、SELECT id from table where id>=2147483648 and id<2147483649; --结果集秒出 

5、SELECT id from table where id>='2147483647' and id<'2147483648'; --结果集秒出 

6、SELECT id from table where id>=CAST(2147483647 AS BIGINT) and id<CAST(2147483648 AS BIGINT);  --结果集秒出

7、SELECT id from table where id=2147483647; --结果集秒出

第3、4条语句的执行计划不同,也就是说2147483647这个值前后的执行计划不一样。

最后创建相同表结构的测试表,并插入了几千行数据(包含了2147483647这个数前后的数据),查询结果集秒出,看起来必须大数据量才能复现。

分别在sqlserver2008和2016版本的生产库上都复现了。

我来答
添加附件
收藏
分享
问题补充
4条回答
默认
最新
chengang

应该是转换溢出,变成了其它数值了。

暂无图片 评论
暂无图片 有用 0
LKH

因为int类型的最大值刚好是2147483647,大于 2147483647 的整数常量将转换为 decimal 数据类型,而不是 bigint 数据类型 。

超过2147483647是用 CAST(xxx AS BIGINT)

暂无图片 评论
暂无图片 有用 0
Coolkid
题主
2024-03-22
第一条sql和第三条sql的执行计划一样。都是有隐式转换为bigint类型(明明字段本身已经是bigint了 不明白为啥还要隐式转换)。另外比较奇怪的点是只一数之差,而且执行计划一样,效率却相差巨大。一旦跳过了2147483647这个数 后边的效率也很高。
Coolkid

ID >=2147483648 and ID <2147483649时具体的执行计划如下


暂无图片 评论
暂无图片 有用 0
Coolkid

第1、2、3条sql的详细执行计划(执行计划截图取自实时执行计划)如下图,只不过第一第二条sql的执行计划没有最后的End:XXX   只有个Start:XXX


暂无图片 评论
暂无图片 有用 0
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏