我有一个数据库,Manifest
其中包含多个Inventory
项目。每个库存项目都有一个整数NetWeight
。
我有以下查询:
SELECT
ID,
(SELECT SUM(NetWeight) FROM Inventory WHERE Inventory.ManifestID = Manifest.ID)
FROM Manifest
这是抛出异常:Arithmetic overflow error converting expression to data type int.
我不明白为什么。
最近,如果没有过滤器,该Inventory
表已经超过了 int 的大小。
但是,我知道并已验证该子查询不存在值大于 100,000 的值。
如果我附加到查询末尾,它运行良好。所有ID都大于0,因此理论上这相当于根本没有过滤器。SUM(NetWeight)
Manifest
WHERE ID > 0
Manifest
我知道我可以将其转换为 abigint
并继续我的一天,但我想了解为什么 SQL 会溢出。
它是否出于某种原因在内部对整个库存表进行求和?
任何见解将不胜感激。
估计查询计划:https://www.brentozar.com/pastetheplan/?id =BJETnFUpa
执行计划的顶部分支选择所有 1,098,300 行
Inventory
并执行此输出(估计 6 个组)被合并连接到
Manifest
(使用右外连接意味着Manifest
保留所有行)。Manifest
基数为 5 行。据推测,存在一个导致组溢出的原因,但不匹配,
ManifestID
因此被连接消除。Inventory
Manifest
也许行在
ManifestID
哪里NULL
?您可以尝试将查询更改为
在计划中较早地消除这些行(Fiddle)。
您还可以评估索引
以避免完全读取这些行并为聚合提供有用的覆盖索引
ManifestID
。