暂无图片
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
打赏 0
LKH

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

超过2147483647是用 CAST(xxx AS BIGINT)

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

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


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

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


暂无图片 评论
暂无图片 有用 0
打赏 0
回答交流
Markdown


请输入正文
提交
相关推荐
从oracle把数据传输到mysql和sql server和uxdb 有没有传输工具?
回答 1
已采纳
ogg可以。但是blob不一定都行。
oracle连接sql server有什么工具?
回答 2
已采纳
这是打算用dblink吧,oracle连接其他类型的数据库,一般是使用透明网关,比如连接sqlserver,简单来说,其实就是先在操作系统上配置个odbc连接到sqlserver,然后在oracle的
sql server中两个数字类型的字段拼接用什么符号?
回答 1
已采纳
先用cast转成字符串类型,再用加号连接selectcast(1asVARCHAR(10))cast(2asVARCHAR(10))
sql server 有两个字段,一个是date一个是int,两个怎么可以相加,得到若干天后的日期?
回答 2
DECLARE@startDateDATE'20230801'DECLARE@daysToAddINT10SELECTDATEADD(day,@daysToAdd,@startDate)ASResul
sql server 的alwayson 一直卡在这里,怎么解决?
回答 2
用你MSSQLERVER服务的登录账号登录执行&nbsp;&nbsp;telnetIP1433看一下端口是否通。最好用第一种创建方案。
oracle的这几个程序包, sql server要检查是否有, 在哪里可以查看?
回答 2
已采纳
sqlserver可以创建oracle的链接服务器,创建了链接服务,就可以访问oracle数据库了。
sql server登录问题
回答 6
你这个加参数C跳过验证,sqlcmdSlocalhostUsaC等同于ADO.NET选项TRUSTSERVERCERTIFICATEtrue
sql server 回滚怎么用?
回答 2
已采纳
以下是SQL回滚的语句:方案:SET&nbsp;&nbsp;XACTABORT&nbsp;&nbsp;ON如果产生错误自动回滚&nbsp;GO&nbsp;BEGIN&nbsp;&nbsp;TRANIN
请问SQL SERVER定时任务存放在那个文件内,我需要恢复定时任务
回答 2
sqlserver的任务支持全脚本创建。建议还是用全脚本创建。
sql server 返回几千条数据会导致响应时间吗?
回答 1
和表数据大小、索引创建情况,sql的索引使用情况有关,一般处理得当,响应时间很短
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~