暂无图片
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


请输入正文
提交
相关推荐
在XP系统上安装SQL server2000,总是提示“安装程序配置服务器失败。参考服务器错误日志和C:\windows\sqlstp.log”,清理注册表后重装,重装系统再重装都不能解决,这是什么原因?
回答 1
他让你参考错误日志C:\windows\sqlstp.log你参考了么?
Oracle sqldeveloper工具把sql server数据库迁移到Oracle:在迁移过程中,这个工具会生成一个脚本把sql server的表和数据迁移到Oracle,提示脚本运行失败
回答 1
错误信息可以放出来
SQL SERVER数据库本身可以修改时区吗?
回答 2
已采纳
数据库的时间都取操作系统,可以改操作系统的时区
SQL Management Studio 平时做运维,链接记录有一大堆IP地址和端口号,有没有什么插件可以让用户自己定义名字?
回答 1
已采纳
SQLManagementStudio这个链接。没有取别名一说。但可以记住密码。如果你要取别名。你可以用其它连接工具。比如免费的dbeaver就可以管理链接,并取别名
请问SQL SERVER定时任务存放在那个文件内,我需要恢复定时任务
回答 2
sqlserver的任务支持全脚本创建。建议还是用全脚本创建。
SQL server 2012数据库,仅创建一个登录名,不赋予任何权限, 但创建后,用登录名登录,发现有所有权限?
回答 1
不会吧。如果你不选择数据库,会连其它数据都不能访问吧。
Sqlserver中audit logout会不会占用大量资源?
回答 1
已采纳
不会,你从跟踪器看到Duration花费时间很长。并不是代表auditlogout占用了很长时间,auditlogout的Duration是指从auditlogin到auditlogout的总时间。也
sql server向开源数据库迁移?
回答 5
学习了,这么多方法,之前也没太注意过,学习了学习了
sql server怎么清理慢日志?
回答 1
已采纳
你是指要清除dmexecquerystats等相关视图信息吗?执行DBCCFREEPROCCACHEDBCCFLUSHPROCINDB(dbid)也可以清除指定语句的缓存计划
从oracle以及sql server数据库的某个表中各取一个字段 作为一个视图,如何在oracle数据库里面实现?
回答 1
已采纳
如果sqlserver那边的表比较小,可以用透明网关,在oracle建立连接到sqlserver的dblink,然后即可在ORACLE中建立同时查询两边表的视图。至于为什么要小表,那是因为关联查询大表
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~